如何同时运行两个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 (开发)之间唯一的区别是缩小和拼接。 我不需要同时启动A和B任务。
首先我带着这个想法来
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,但是它们都破坏了livereload
function。
我的解决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