web-dev-qa-db-fra.com

Comment exécuter deux tâches de surveillance en même temps

Est-il possible d'exécuter deux tâches de surveillance simultanément?

Je comprends que je peux avoir le nombre de tâches que je veux à l’intérieur de regarder les paramètres et simplement lancer grunt watch et il les regardera toutes, comme ceci

...
watch: {
    A: {
        files: "js/dev/**/*.coffee",
        tasks: ["coffee", "requirejs"]
    },
    B: {
        files: "js/dev/**/*.coffee",
        tasks: ["coffee"]
    },
    C: {
        files: "js/dev/**/*.html",
        tasks: ["copy"]
    }
}
...

... mais je n'ai pas besoin de ça. Je veux juste avoir différentes tâches pour le développement et la production. Comme vous pouvez le deviner, la seule différence entreA(production) etB(développement) est la minification et la concaténation. Je n'ai pas besoin de lancerAetBtâches en même temps.

D'abord je suis venu avec cette idée

grunt.registerTask("prod", ["watch:A", "watch:C"]);
grunt.registerTask("dev", ["watch:B", "watch:C"]);

Mais cela n'a pas fonctionné. Les premières tâches de surveillance fonctionnent (Cne fonctionne jamais). Est-ce possible de faire ce que je veux?

58
Vitalii Korsakov

J'ai trouvé en utilisant grunt-concurrent works:

concurrent: {
  options: {
    logConcurrentOutput: true
  },
  prod: {
    tasks: ["watch:A", "watch:C"]
  },
  dev: {
    tasks: ["watch:B", "watch:C"]
  }
}

Ensuite:

grunt.registerTask("prod", ["concurrent:prod"]);
grunt.registerTask("dev", ["concurrent:dev"]);
74
Nicolas Hery

EDIT: concurrent a maintenant une option logConcurrentOutput! Plus d'infos ici: https://github.com/sindresorhus/grunt-concurrent#logconcurrentoutput .

Watch est une tâche étrangement concurrente mais bloquante. Vous devez donc faire preuve de créativité pour que les fonctionnalités multitâches fonctionnent.

Concurrent perd toutes les sorties des tâches de surveillance, ce qui n'est pas idéal.

Essayez d’écrire dynamiquement l’objet config dans une tâche personnalisée:

grunt.registerTask('watch:test', function() {
  // Configuration for watch:test tasks.
  var config = {
    options: {
      interrupt: true
    },
    unit: {
      files: [
        'test/unit/**/*.spec.coffee'
      ],
      tasks: ['karma:unit']
    },
    integration: {
      files: [
        'test/integration/**/*.rb',
        '.tmp/scripts/**/*.js'
      ],
      tasks: ['exec:rspec']
    }
  };

  grunt.config('watch', config);
  grunt.task.run('watch');
});
18
RobW

La meilleure et la seule solution qui fonctionne est la suivante: https://npmjs.org/package/grunt-focus Ajoutez ce plugin puis:

focus: {
            sources: {
                include: ['js', 'html', 'css', 'grunt']
            },
            testu: {
                include: ['js', 'html', 'css', 'testu', 'grunt']
            },
            testi: {
                include: ['js', 'html', 'css', 'testu', 'testi', 'grunt']
            }
        },
        watch: {
            js: {
                files: paths.js,
                tasks: ['jshint'],
                options: {
                    livereload: true
                }
            },
            html: {
                files: paths.html,
                options: {
                    livereload: true
                }
            },
            css: {
                files: paths.css,
                tasks: ['csslint'],
                options: {
                    livereload: true
                }
            },
            testu: {
                files: ['test/**/*.js', 'test/**/*.css'],
                tasks: ['mochaTest'],
                options: {}
            },
            testi: {
                files: ['test/**/*.js', 'test/**/*.css'],
                tasks: ['exec:cleanTestDB', 'protractor_webdriver', 'protractor'],
                options: {}
            },
            grunt: {
                files: ['Gruntfile.js', 'server/config/env/*.js'],
                options: {
                    reload: true
                }
            }
        }

Ensuite, vous utilisez focus: sources ou focus: testu à votre convenance.

JM.

10
jmcollin92

grunt-concurrent ou Grunt-focus sont deux bonnes solutions, mais elles cassent toutes les fonctionnalités livereload.

Ma solution à cela est de composer la configuration de la montre de manière dynamique, en supposant que vous n'exécuterez pas les deux configurations en même temps.

Vous pouvez faire quelque chose comme ça

grunt.config.merge({
  watch: {
    options: {
      livereload: true
    },
    C: {
      files: "js/dev/**/*.html",
      tasks: ["copy"]
    }
  }
});

grunt.registerTask('watch-forProd', function () {
  grunt.config.merge({
    watch: {
      A: {
        files: "js/dev/**/*.coffee",
        tasks: ["coffee", "requirejs"]
      }
    }
  });

  grunt.task.run('watch');
});

grunt.registerTask('watch-forDev', function () {
  grunt.config.merge({
    watch: {
      B: {
        files: "js/dev/**/*.coffee",
        tasks: ["coffee"]
      }
    }
  });

  grunt.task.run('watch');
});

grunt.registerTask("prod", ["watch-forProd"]);
grunt.registerTask("dev", ["watch-forDev"]);

7
Alex Shnayder

Sans se soucier de grunt.registerTask () dans Gruntfile.js, je lance parfois grunt en tant que processus en arrière-plan dans la ligne de commande:

$ grunt watch:A &
$ grunt watch:C &

Vous pouvez créer les commandes sous forme de script batch pour plus de commodité. J'espère que ça aide.

1
user3487528

SEPTEMBRE 2018

Vous n'avez plus besoin d'utiliser grunt-simultané. Grunt a maintenant ceci intégré, voici un exemple de l'un de mes projets en cours ...

module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        sass: {
            theme: {
                files: {
                    '../../web/sites/all/themes/ifafri/css/generated/theme_ifafri_master.css' : '../../web/sites/all/themes/ifafri/css/master.scss'
                }
            },
            bootstrap: {
                files: {
                    '../../web/sites/all/themes/ifafri/css/generated/theme_ifafri_bootstrap.css' : '../../web/sites/all/themes/ifafri/css/bootstrap/master.scss' 
                }
            }
        },
        watch: {
            theme: {
                files: '../../web/sites/all/themes/ifafri/css/*.scss',
                tasks: ['sass:theme'],
                options: {
                    spawn: false,
                    livereload: true,
                    nospawn: false
                }
            },
            bootstrap: {
                files: '../../web/sites/all/themes/ifafri/css/bootstrap/*.scss',
                tasks: ['sass:bootstrap'],
                options: {
                    spawn: false,
                    livereload: true,
                    nospawn: false
                }
            }
    }
    });
    grunt.loadNpmTasks('grunt-contrib-sass');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-livereload');
    grunt.registerTask('default',['watch']);
}
0
Simon

Je sais que cela ne répond pas directement à la question, mais ma solution consiste maintenant à utiliser Gulp au lieu de Grunt . Avec Gulp, vous codez et non pas à configurer. Vous êtes donc plus libre de faire ce que vous voulez.

JM.

0
jmcollin92