Как объединить несколько часовых задач для разных задач компаса в Grunt
У нас есть некоторые проблемы с настройкой Grunt. Наша текущая настройка проекта такова. У нас есть папка Themes, в этой папке находятся различные темы, которые содержат собственные файлы SCSS и другие фрагменты, связанные с этой темой.
Наш файл grunt настроен примерно на 15 тем (оставив настройки Grunt по умолчанию и JSHint, потому что Grunt работает):
compass: {
options: {
...
}
theme1: {
src: ['App/Themes/theme1/scss/**/*.scss'],
tasks: ['compass'],
options: {
sassDir: 'App/Themes/theme1/scss',
cssDir: 'App/Themes/theme1'
}
},
theme2: {
src: ['App/Themes/theme2/scss/**/*.scss'],
tasks: ['compass'],
options: {
sassDir: 'App/Themes/theme2/scss',
cssDir: 'App/Themes/theme2'
}
},
...
}
concurrent: {
watch: {
tasks: ['compass:theme1', 'compass:theme2', ..., 'compass:themeXX'],
options: {
logConcurrentOutput: true,
spawn: false
}
}
}
grunt.loadNpmTasks('grunt-concurrent');
grunt.loadNpmTasks('grunt-contrib-compass');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.registerTask('default', ['concurrent']);
Фактическая проблема заключается в том, что когда мы запускаем задание по умолчанию, также запускаются потоки x watch. Которые имеют много накладных расходов для небольшой задачи часов, которые они должны сделать.
Решение, которое я ищу, - это способ настроить одну задачу наблюдения, которая может запускать компиляцию конкретной темы. Есть способ сделать это? Или текущая настройка - единственный способ сделать это? Так нет другого варианта, кроме как иметь х смотреть задачи?
Благодарю.
1 ответ
Во-первых, создайте задачу наблюдения в вашем объекте конфигурации, который просматривает файлы, но не выполняет никаких задач. Используя шаблон глобуса, попросите наблюдателя шпионить за всеми .scss
файлы в каталоге тем:
grunt.initConfig({
compress: {}, //your existing compress object goes here
watch: {
themes: {
files: ['App/Themes/**/*.scss'],
tasks: []
},
},
});
Далее вы собираетесь добавить grunt.event
слушатель вашего gruntfile. Событие слушателя представит измененный файл (пример: App/Themes/theme1/scss/foobar.scss
). Теперь вы можете определить, какая цель сжатия (theme1
) бежать:
grunt.event.on('watch', function(action, filepath, target) {
if (target === 'themes') {
var theme = filepath.split("/");
grunt.task.run('compress.' + theme[2]); //tells grunt to run "compress.theme1" based on this example
}
});