Как изменить задачи grunt watch на основе измененного файла?

m пишу программу node.js, которая будет следить за каталогом, заполненным большим (300-тысячным) количеством проектов scss. Grunt-watch (запускается либо через модуль узла, либо самостоятельно, независимо от того, что работает) будет настроен таким образом, чтобы при каждом изменении файла scss он компилировался с компасом, а выходной файл перемещался в отдельный каталог, например:

./1234/style.scss был изменен >> grunt-watch запускает grunt-compass >> /foo/bar/baz/1234/style.css обновлен

Каталог проекта, в котором находился файл, очевидно, очень важен (если grunt-compass отправит все скомпилированные файлы в один и тот же каталог, они будут перемешаны и непригодны, а автоматизация grunt будет бесполезной). Я приказываю, чтобы все файлы были направлены в правильное место, я динамически меняю настройки grunt-compass каждый раз, когда файл css обновляется.

Образец gruntfile:

module.exports = function(grunt) {

grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    watch: {
      files: './*/*.scss',
      tasks: ['compass']
    },
    compass: {
      origin:{
        options: {
          //temportary settings to be changed later
          sassDir: './',
          cssDir: './bar',
          specify: './foo.scss'
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-compass');

  grunt.event.on('watch', function(action, filepath, target) {
    var path = require('path');
    grunt.log.writeln(target + ': ' + filepath + ' might have ' + action);
    var siteDirectory = path.dirname(filepath);

    //changes sass directory to that of the changed file
    var option = 'compass.origin.options.sassDir';
    var result = __dirname + '/' + siteDirectory;
    grunt.log.writeln(option + ' changed to ' + result);
    grunt.config(option, result);

    //customizes css output directory so that file goes to correct place
    option = 'compass.origin.options.cssDir';
    result = path.resolve(__dirname, '../', siteDirectory);
    grunt.log.writeln(option + ' changed to ' + result);
    grunt.config(option, result);

    //grunt.task.run(['compass']);

  });

};

Однако это нет работа. Если вы бежитехрюканье смотреть в подробном режиме вы увидите, что grunt запускает как функцию grunt.event.on, так и задачу наблюдения в отдельных процессах. При повторном разборе файла gruntfile все мои изменения в файле event.on изменяются на значения по умолчанию, указанные выше, и компас не запускается.

Как видно из комментариев к event.on, я попытался добавить grunt.task.run (), чтобы убедиться, что компас был запущен в том же процессе, что и функция event.on, что сохранит мои изменения конфигурации. Однако задание отказалось выполнить, вероятно потому, что яЯ делаю это неправильно.

К сожалению, переменные grunt.event.on не отправляются в определенную задачу grunt-watch, иначе я мог бы написать пользовательскую функцию, которая изменила бы настройки компаса, а затем запустить компас в том же процессе.

Мы пытались реализовать это без усилий, используя функцию наблюдения, встроенную в компас, однако компас может хранить только один статический выходной путь на проект и может наблюдать только один проект за один раз.

В настоящее время я обошел эту проблему, добавив программу узла, которая принимает имя сайта в качестве параметра, переписывает grunfile.js, запустив с помощью fs, а затем запустив 'хрюканье смотреть через функцию exec. Это однако имеет этосвои недостатки (могуя не могу просмотреть данные grunt.log) и ужасно запутанЯ хотел бы изменить это.

Большое спасибо за понимание.

Ответы на вопрос(1)

Ваш ответ на вопрос