2013-07-29 4 views
5

Я пишу программу 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) и ужасно запутан, поэтому я хотел бы изменить его.

Благодарим вас за понимание.

+0

Это не ответит на ваш вопрос, но почему на компасе есть часы для ворчания? Компас уже поставляется с 'compass watch' – pllee

+0

Вам нужно указать' options: {nospawn: true} 'в вашей конфигурации задач watch, чтобы запустить' watch' в том же контексте ([см. Этот раздел в документах] (https://github.com/gruntjs/grunt-contrib-watch#compiling-files-as-needed)). –

+0

@ go-oleg Спасибо! Это работает чудесно. Я удивлен, что не видел этого в документах, поскольку он прямо утверждает, что 'nospawn' решает такие проблемы, как мой. – anachronism

ответ

11

Вы должны указать

options : { nospawn : true }

в циферблате задачи конфигурации, чтобы иметь часы работать в том же контексте:

watch: { 
    files: './*/*.scss', 
    tasks: ['compass'], 
    options : { nospawn : true } 
} 

См this section документации для получения дополнительной информации по этому вопросу.

+0

Оценил этот ответ. Прочтите документацию, но не ясно, что означает «контекст» и как это повлияло на опцию «nospawn». Благодаря! – jerome

+0

Спасибо за ответ! – vgrinko

+2

Чтобы добавить обновление к этому ответу, по состоянию на июнь 2016 года этот параметр теперь: 'spawn: false' – BigHeadCreations

 Смежные вопросы

  • Нет связанных вопросов^_^