Grunt监听:只编译一个文件而非所有文件

8

我已经设置了grunt,将所有的coffee文件编译为javascript,并使用动态映射来维护所有文件夹结构,效果非常好。

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

我想要做的是使用watch来编译任意更改过的咖啡文件,并仍然保持文件夹结构。使用上述任务和以下watch任务可以实现这一点:

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

问题在于当一个文件发生变化时,它会再次将整个 coffee 目录编译为 JavaScript,如果只编译该文件所做的更改,那将是极好的。这在 Grunt 中是否自然可行?还是需要自定义功能实现。关键在于它必须保持文件夹结构,否则就容易出错。
我们在工作中有定制的监视脚本,并且我正在尝试将其转移到 Grunt 上,但需要此功能才能实现。

这个对你有用吗:Github链接:根据需要编译文件?这里还有一个有趣的讨论:Github链接:为文件包含提供条件支持。 - dc5
重复:http://stackoverflow.com/questions/16203741/using-grunt-is-it-possible-to-compile-and-output-a-single-changed-file-to-a-dif -- 但那个没有好的答案。 - jcollum
我几个月前遇到了这个问题,但决定不必担心——grunt只需要大约2秒钟来编译我所有的咖啡文件(大约40个)。 - jcollum
我们可能有大约200个,我的问题是我们当前的系统只编译了更改的部分,所以我无法向任何人推销一个更慢的系统。 - James Billings
可能并不像你所说的那样“自然”,但你可以为每个文件创建单独的目标(在coffeewatch任务中都是如此)。对于200个文件,你可能需要动态地这样做,但这会更加困难。 - Jordan Kasper
可能是[Grunt:监视多个文件,仅编译更改的文件]的重复问题(https://dev59.com/pmQn5IYBdhLWcg3wgnPg) - bummi
2个回答

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"]);
};

3

太好了!终于我可以只编译更改过的less文件,而且仍然可以使用css livereload! - Narretz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接