Как одновременно запускать две задачи
Можно ли одновременно запускать две задачи просмотра?
Я понимаю, что у меня может быть любое количество задач, которые я хочу в настройках просмотра часов, и просто запускать часы для ворчания, и он будет смотреть их все, как этот
...
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 никогда не работает). Возможно ли сделать то, что я хочу?
Ответы
Ответ 1
Я нашел, используя grunt-concurrent работает:
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"]);
Ответ 2
EDIT: теперь имеет параметр logConcurrentOutput
! Подробнее здесь: https://github.com/sindresorhus/grunt-concurrent#logconcurrentoutput.
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');
});
Ответ 3
Лучшее и единственное рабочее решение: 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.
Ответ 4
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"]);
Ответ 5
СЕНТЯБРЬ 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']);
}
Ответ 6
Не беспокоясь о grunt.registerTask() в Gruntfile.js, я иногда запускаю grunt как фоновые процессы, набирая в командной строке следующее:
$ grunt watch:A &
$ grunt watch:C &
Вы можете сделать команды как пакетный скрипт для большего удобства. Надеюсь, это поможет.
Ответ 7
Я знаю, что это не ответит прямо на вопрос, но теперь я решил использовать Gulp вместо Grunt.
С помощью Gulp вы кодируете и не только настраиваете. Таким образом, вы более свободны делать то, что хотите.
JM.
Ответ 8
Параллельно работает отлично для меня
concurrent: {
options: {
logConcurrentOutput: true
},
set1: ['watch:html', 'watch:styles'],
},
grunt.registerTask('default', 'watch');
grunt.registerTask('htmlcss', ['concurrent:set1']);
Ответ 9
Просто измените адрес порта и порт загрузки.
Напр. если порт 9000, измените его на 8000 и перезагрузите с 35729 до 36729