Как запустить две задачи grunt watch одновременно
можно ли одновременно запускать две задачи наблюдения?
Я понимаю, что у меня может быть любое количество задач, которые я хочу внутри посмотреть настройки и просто запустите хрюкать смотреть и он будет смотреть их всех, вот так
...
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 никогда не работает). Можно ли сделать то, что я хочу?
8 ответов:
Я нашел с помощью грунт-одновременных работает:
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"]);
EDIT: concurrent теперь имеет ! Более подробная информация здесь:https://github.com/sindresorhus/grunt-concurrent#logconcurrentoutput.
Watch-это странно параллельная, но блокирующая задача, поэтому вам нужно быть творческим, чтобы работать с многозадачной функциональностью.
Concurrent теряет все выходные данные из задач watch, что не идеально.
попробуйте динамически написать объект конфигурации в пользовательской задаче:
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'); });
лучшее и единственное рабочее решение есть: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 } } }
затем вы используете focus:sources или focus: testu в качестве вашего удобства.
JM.
grunt-concurrent или grunt-focus - оба хороших решения, но оба они ломаются
livereload
функциональность.мое решение состоит в том, чтобы составить конфигурацию часов динамически, с предположением, что вы не будете запускать обе конфигурации одновременно.
Вы можете сделать что-то подобное
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"]);
Я знаю, что это не ответ непосредственно на вопрос, но мое решение теперь использовать глоток вместо хрюканья. С Gulp вы кодируете и не только настраиваете. Таким образом, вы более свободны делать то, что вы хотите.
JM.
сентябрь 2018
вам не нужно использовать grunt-concurrent больше grunt теперь имеет этот встроенный, вот пример из одного из моих текущих проектов...
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']); }