Grunt watch:只编译一个文件而不是全部

时间:2013-09-19 16:59:02

标签: node.js coffeescript gruntjs grunt-contrib-watch

我有咕噜咕噜的设置将我的所有咖啡文件编译成javascript并使用dynamic_mappings维护所有文件夹结构,效果很好。

coffee: {
  dynamic_mappings: {
    files: [{
      expand: true,
      cwd: 'assets/scripts/src/',
      src: '**/*.coffee',
      dest: 'assets/scripts/dest/',
      ext: '.js'
    }]
  }
}

我想要做的是使用watch来编译任何已更改的咖啡文件并仍然保持文件夹结构。这可以使用上述任务执行此监视任务:

watch: {
  coffeescript: {
    files: 'assets/scripts/src/**/*.coffee',
    tasks: ['coffee:dynamic_mappings']
  }
}

问题在于,当一个文件发生变化时,它会将整个咖啡目录再次编译成Javascript,如果它只编译改为Javascript的单个咖啡文件,那就太棒了。这在Grunt中是否自然可行,或者这是一个自定义功能。这里的关键是必须保持文件夹结构,否则很容易。

我们在工作中有自定义监视脚本,我正在尝试在Grunt上销售它们,但需要此功能才能执行此操作。

2 个答案:

答案 0 :(得分:9)

您可以使用类似以下Gruntfile的内容。每当CoffeeScript文件发生更改时,它都会更新coffee:dynamic_mappings的配置,以仅将修改后的文件用作src

此示例是grunt-contrib-watch readme中示例的略微修改版本。

希望它有所帮助!

var path = require("path");
var srcDir = 'assets/scripts/src/';
var destDir = 'assets/scripts/dest/';

module.exports = function( grunt ) {
    grunt.initConfig( {
        coffee: {
            dynamic_mappings: {
                files: [{
                    expand: true,
                    cwd: srcDir,
                    src: '**/*.coffee',
                    dest: destDir,
                    ext: '.js'
                }]
            }
        },
        watch : {
            coffeescript : {
                files: 'assets/scripts/src/**/*.coffee',
                tasks: "coffee:dynamic_mappings",
                options: {
                    spawn: false, //important so that the task runs in the same context
                }
            }
        }
    } );

    grunt.event.on('watch', function(action, filepath, target) {
        var coffeeConfig = grunt.config( "coffee" );
        // Update the files.src to be the path to the modified file (relative to srcDir).
        coffeeConfig.dynamic_mappings.files[0].src = path.relative(srcDir, filepath);
        grunt.config("coffee", coffeeConfig);
    } );

    grunt.loadNpmTasks("grunt-contrib-coffee");
    grunt.loadNpmTasks("grunt-contrib-watch");

    grunt.registerTask("default", [ "coffee:dynamic_mappings", "watch:coffeescript"]);
};

答案 1 :(得分:3)

从类似问题https://stackoverflow.com/a/19722900/1351350

的答案中找到了解决方案

简短回答:试试https://github.com/tschaub/grunt-newer