Я пишу программу node.js, которая будет наблюдать за каталогом, заполненным большими (300-ий) количеством scss-проектов. Grunt-watch (выполняется либо через модуль узла, либо сам по себе, независимо от того, что работает) будет сконфигурирован так, что всякий раз, когда изменяется scss-файл, он будет скомпилирован с компасом, выходной файл перемещается в отдельный каталог, например:Как изменить задачи на работу с графикой на основе файла?
./1234/style.scss был изменен >> хрюкать-часы работают хрюкать компас >> /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 watch» в подробном режиме, вы увидите, что grunt запускает как функцию grunt.event.on, так и задачу просмотра в отдельных процессах. Второй синтаксический анализ файла grunt возвращает все изменения конфигурации event.on в значения по умолчанию выше, а компас не запускается.
Как видно из комментариев к событию, я попытался добавить grunt.task.run(), чтобы убедиться, что компас был запущен в том же процессе, что и функция event.on, которая сохранит мои изменения в конфигурации. Однако задача отказалась работать, вероятно, потому, что I'm doing it wrong.
К сожалению, переменные grunt.event.on не отправляются в заданную задачу grunt-watch, в противном случае я мог бы написать пользовательскую функцию, которая изменит настройки компаса, а затем запустит компас в том же процессе.
Я попытался реализовать это без ворчания, используя встроенную функцию часов в компас, однако компас может хранить только один статический путь вывода для каждого проекта и может смотреть только один проект за один раз.
В настоящее время я столкнулся с этой проблемой, добавив программу-узел, которая принимает имя сайта в качестве параметра, переписывает grunfile.js, запуская с помощью fs, а затем запуская «grunt watch» с помощью функции exec. Однако это имеет свои недостатки (я не могу просмотреть данные grunt.log) и ужасно запутан, поэтому я хотел бы изменить его.
Благодарим вас за понимание.
Это не ответит на ваш вопрос, но почему на компасе есть часы для ворчания? Компас уже поставляется с 'compass watch' – pllee
Вам нужно указать' options: {nospawn: true} 'в вашей конфигурации задач watch, чтобы запустить' watch' в том же контексте ([см. Этот раздел в документах] (https://github.com/gruntjs/grunt-contrib-watch#compiling-files-as-needed)). –
@ go-oleg Спасибо! Это работает чудесно. Я удивлен, что не видел этого в документах, поскольку он прямо утверждает, что 'nospawn' решает такие проблемы, как мой. – anachronism