Как изменить задачи 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) и ужасно запутанЯ хотел бы изменить это.
Большое спасибо за понимание.