8

我有 grunt setup 将我所有的咖啡文件编译成 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 上出售它们,但需要这个功能来做到这一点。

4

2 回答 2

9

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

此示例是grunt-contrib-watch 自述文件中示例的略微修改版本。

希望能帮助到你!

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"]);
};
于 2013-11-02T00:36:29.797 回答
3

从类似问题的答案中找到了解决方案https://stackoverflow.com/a/19722900/1351350

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

于 2014-04-29T15:55:38.433 回答