我有咕噜咕噜的设置将我的所有咖啡文件编译成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上销售它们,但需要此功能才能执行此操作。
答案 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)