5

我正在编写一个 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 数据)并且非常复杂,所以我想改变它。

非常感谢您的任何见解。

4

1 回答 1

11

您需要指定

options : { nospawn : true }

在您的监视任务配置中让监视在相同的上下文中运行:

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

有关这方面的更多信息,请参阅文档的此部分

于 2013-07-31T01:49:47.893 回答