如何同时运行两个grunt监视任务

是否可以同时运行两个监视任务?

据我所知,我可以在手表设置中执行任意数量的任务,只需启动grunt手表就可以看到所有这些,就像这样

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

…但我不需要这个 我只是想有不同的开发和生产任务。 你可以猜到, A (生产)和B (开发)之间唯一的区别是缩小和拼接。 我不需要同时启动AB任务。

首先我带着这个想法来

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

但是这不起作用。 只是第一个观看任务正在工作( C从来没有工作)。 有可能做我想做的事吗?

我发现使用grunt并发的作品:

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

然后:

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

编辑:并发现在有一个logConcurrentOutput选项! 更多信息在这里: https : //github.com/sindresorhus/grunt-concurrent#logconcurrentoutput 。

监视是一个奇怪的并发但阻塞的任务,所以你必须有创意才能使多任务function正常工作。

同时丢失所有的观察任务的输出,这是不理想的。

尝试在自定义任务中dynamic编写configuration对象:

 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'); }); 

最好的和唯一的工作解决scheme是: https : //npmjs.org/package/grunt-focus添加这个插件,然后:

 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 } } } 

然后你使用焦点:来源或重点:testu作为您的方便。

JM。

grunt-concurrent或grunt-focus都是很好的解决scheme,但是它们都破坏了livereloadfunction。

我的解决scheme是dynamic组合手表configuration,假设您不会同时运行两个configuration。

你可以做这样的事情

 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"]); 

我知道这不是直接回答这个问题,但我现在的解决scheme是使用Gulp而不是Grunt。 用Gulp你编码,不仅configuration。 所以你更自由地做你想做的事情。

JM。

并行工作对我来说很好

 concurrent: { options: { logConcurrentOutput: true }, set1: ['watch:html', 'watch:styles'], }, grunt.registerTask('default', 'watch'); grunt.registerTask('htmlcss', ['concurrent:set1']); 

只需更改端口地址和livereload端口。 例如。 如果端口是9000,则将其更改为8000,然后从35729重新加载到36729