Как объединить несколько часовых задач для разных задач компаса в 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
  }
});
Другие вопросы по тегам