我正在编写一个node.js程序,该程序将监视包含大量(300 ish)数量的scss项目的目录。将配置Grunt- watch(可以通过节点模块运行,也可以单独运行,无论如何工作),以便每当更改scsss文件时,都将使用罗盘对其进行编译,并将输出文件移至单独的目录,例如:
./1234/style.scss已更改>> grunt-watch运行grunt-compass >> /foo/bar/baz/1234/style.css已更新
该文件所在的项目目录显然非常重要(如果grunt- compass将所有已编译的文件发送到同一目录,它们将变得混乱且无法使用,grunt自动化将毫无目的)。为了确保将所有文件都路由到正确的位置,每次更新CSS文件时,我都会动态更改grunt- compass设置。
示例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函数和watch任务。gruntfile的第二次解析将我的所有event.on config更改为上面的默认值,并且罗盘无法运行。
如在event.on注释中所示,我尝试添加grunt.task.run()以确保指南针与event.on函数在同一进程中运行,这将保留我的配置更改。但是该任务拒绝运行,可能是因为我做错了。
不幸的是,grunt.event.on变量不会发送到已定义的grunt- watch任务,否则我可以编写一个自定义函数来更改罗盘设置,然后在同一过程中运行罗盘。
我尝试使用指南针中内置的watch函数在不费吹灰之力的情况下实施此操作,但是指南针每个项目只能存储一个静态输出路径,并且一次只能监视一个项目。
我目前通过添加一个以站点名称为参数的节点程序来解决这个问题,该节点程序通过使用fs运行重写grunfile.js,然后通过exec函数运行“ grunt watch”。但是,这有其自身的缺点(我无法查看grunt.log数据)并且令人费解,所以我想更改它。
非常感谢您的见解。
您需要指定
options : { nospawn : true }
在监视任务配置中,以使监视在相同的上下文中运行:
watch: { files: './*/*.scss', tasks: ['compass'], options : { nospawn : true } }
有关更多信息,请参阅本节文档。