我正在编写一个 node.js 程序,它将监视一个充满大量(300-ish)scss 项目的目录。Grunt-watch(通过 node 模块运行或单独运行,无论工作如何)将被配置,以便每当更改 scss 文件时,它将使用 compass 编译,输出文件移动到单独的目录,例如:
./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 配置更改恢复为上面的默认值,并且 compass 无法运行。
正如在 event.on 评论中看到的那样,我尝试添加一个 grunt.task.run() 以确保 compass 与 event.on 函数在同一进程中运行,这将保留我的配置更改。但是任务拒绝运行,可能是因为我做错了。
不幸的是,grunt.event.on 变量没有发送到定义的 grunt-watch 任务,否则我可以编写一个自定义函数来更改罗盘设置,然后在同一进程中运行罗盘。
我已经尝试在没有 grunt 的情况下实现这一点,使用内置于 compass 的 watch 功能,但是 compass 只能为每个项目存储一个静态输出路径,并且一次只能观看一个项目。
我目前已经通过添加一个节点程序来解决这个问题,该程序将站点名称作为参数,通过使用 fs 运行重写 grunfile.js,然后通过 exec 函数运行“grunt watch”。然而,这有它自己的缺点(我无法查看 grunt.log 数据)并且非常复杂,所以我想改变它。
非常感谢您的任何见解。