你怎么看多个文件,但只能在Grunt.js中运行更改后的文件的任务?

在学习如何使用grunt时 ,我试图做一个简单的咖啡脚本观察器/编译器。 问题是,如果我告诉watch任务要观看几个文件,而且有一个改变,它将把所有文件传递给coffee命令。 这意味着当您更改1个文件时,将重新编译与src模式匹配的所有文件。 相反,我只想重新编译与src模式相匹配的单个文件。

这里是grunt.js

 module.exports = function(grunt) { grunt.initConfig({ coffee: { app: { src: ['test/cases/controller/*.coffee'], dest: 'tmp', options: { bare: true, preserve_dirs: true } } }, watch: { files: ['<config:coffee.app.src>'], tasks: ['coffee:app'] } }); grunt.loadNpmTasks('grunt-coffee'); grunt.registerTask('default', 'coffee'); }; 

这是使用grunt-coffee ,基本上这是: https : //gist.github.com/2373159 。

当我运行grunt watch ,并在test/cases/controller/*.coffee grunt watch保存一个文件时,它将编译所有匹配的文件(把它们放在tmp/* )。

你怎么反而用grunt 编译更改的文件

即将到来的(现在正在开发中的)v0.4.0a grunt有grunt.file.watchFiles对象,它是专为此目的而devise的。 grunt-coffee插件可能已经增加了对这个function的支持,我不确定。

无论哪种方式,如果您有兴趣在项目中尝试一个开发版的grunt,请查看我何时能够使用开发中的function“X”? FAQ条目。

编译我的less文件时,我得到了这个工作。 你应该可以把这个configuration搞乱一点,以便和coffeescript插件一起工作。 感兴趣的部分是grunt.event.on('watch', ...) 。 在这个事件处理程序中,我更新less命令中的files属性来仅包含更改后的文件。

 path = require('path'); module.exports = function(grunt) { // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), less: { development: { options: { paths: ["./library/less"], }, files: [ { src: "./library/less/bootstrap.less", dest: "./library/css/bootstrap.css"}, { src: "./library/less/app.less", dest: "./library/css/app.css"} ] } }, watch: { styles: { files: "./library/less/*", tasks: ["less"], options: { nospawn: true, }, }, }, }); // Event handling grunt.event.on('watch', function(action, filepath){ // Update the config to only build the changed less file. grunt.config(['less', 'development', 'files'], [ {src: filepath, dest: './library/css/' + path.basename(filepath, '.less') + '.css'} ]); }); // Load the plugins grunt.loadNpmTasks('grunt-contrib-less'); grunt.loadNpmTasks('grunt-contrib-watch'); // Tasks grunt.registerTask('default', ['watch']); }; 

这些答案都没有为我工作得很好。 如果有人感兴趣,我的解决scheme是这样的(我知道我在回答这个问题上迟了一点)。

https://gist.github.com/ryansmith94/8569178

在这个问题上 ,凯尔·罗宾逊build议使用watch事件。 将守护任务nospawn属性设置为true以使其工作非常重要。 我修改了他的解决scheme来select性地运行任务:

 grunt.event.on('watch', function(action, filepath) { if (minimatch(filepath, grunt.config('watch.stylesheets.files'))) { grunt.config('compass.dist.options.specify', [filepath]); } if (minimatch(filepath, grunt.config('watch.scripts.files'))) { var uglifySrc = filepath.replace(grunt.config('uglify.dist.cwd'), ''); grunt.config('jshint.dist.src', [filepath]); grunt.config('uglify.dist.src', [uglifySrc]); } }); 

这是完整的解决scheme: https : //gist.github.com/luissquall/5408257

https://github.com/tschaub/grunt-newer看起来像完全相同的任务:;

将Grunt任务configuration为仅使用较新的文件运行。

提纲:新的任务将configuration另一个任务运行src文件,比新的dest文件更新或b)比上次成功运行(如果没有dest文件)更新。 看下面的例子和更多的细节。

您可以轻松地预先安排任何任务。 在你的情况下:

  grunt.loadNpmTasks('grunt-newer'); grunt.registerTask('default', 'newer:coffee'); 

所以新的Grunt 0.4是更多的命名任务

让我们举个例子吧!

 watch: { package1: { files: [ './modules/package1/**/*.coffee' ], tasks: ['coffee:package3'] }, package2: { files: [ './test_packages/package2/**/*.coffee' ], tasks: ['coffee:package3'] }, package3: { files: [ './test_packages/package3/**/*.coffee' ], tasks: ['coffee:package3'] }, } 

要运行所有这些监视任务,只需执行grunt.registerTask('default',['myInitialBuild','watch']);

myInitialBuild是无论初始build设(所有的文件),然后按照每个包裹上一块手表。 实际上,你可以为每个文件做这个,但听起来很糟糕。

grunt-contrib-watch任务现在支持这个。

https://npmjs.org/package/grunt-contrib-watch – >寻找“根据需要编译文件”

 grunt.initConfig({ watch: { scripts: { files: ['lib/*.js'], tasks: ['jshint'], options: { nospawn: true, }, }, }, jshint: { all: ['lib/*.js'], }, }); // on watch events configure jshint:all to only run on changed file grunt.event.on('watch', function(action, filepath) { grunt.config(['jshint', 'all'], filepath); }); 

这应该防止任务在每次更改时都编译所有文件。