仅在最近修改的文件上运行grunt-contrib-jshint

我们正在重构一个非常大的网站上的代码。 我想对任何被更改的文件强制执行linting,但是忽略其他的文件(因为其中很多文件最终会被删除,因此浪费时间来整理它们)。

我想有一个咕task任务,检查一个文件的修改date比它创build(*从回购)date更新,如果是这样(如果有更新的话,也可以更新一个json文件列表被删除)。

除了grunt及其插件之外,我还没有使用过多的节点。 我将使用http://gruntjs.com/creating-tasks作为起点,但是有人可能会为我画出如何处理写这个任务的方法,特别是关于不同步的任何考虑。

几个选项:

1 – 您可以使用自定义filter函数来过滤由您的jshint文件模式返回的文件列表。 像这样的东西:

module.exports = function(grunt) { var fs = require('fs'); var myLibsPattern = ['./mylibs/**/*.js']; // on linux, at least, ctime is not retained after subsequent modifications, // so find the date/time of the earliest-created file matching the filter pattern var creationTimes = grunt.file.expand( myLibsPattern ).map(function(f) { return new Date(fs.lstatSync(f).ctime).getTime() }); var earliestCreationTime = Math.min.apply(Math, creationTimes); // hack: allow for 3 minutes to check out from repo var filterSince = (new Date(earliestCreationTime)).getTime() + (3 * 60 * 1000); grunt.initConfig({ options: { eqeqeq: true, eqnull: true }, jshint: { sincecheckout: { src: myLibsPattern, // filter based on whether it's newer than our repo creation time filter: function(filepath) { return (fs.lstatSync(filepath).mtime > filterSince); }, }, }, }); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.registerTask('default', ['jshint']); }; 

2 – 使用grunt-contrib-watch插件来检测文件何时更改。 然后你可以阅读事件中的文件列表,如Kyle Robinson Young(“shama”)的评论中所述:

 grunt.initConfig({ watch: { all: { files: ['<%= jshint.all.src %>'], tasks: ['jshint'], options: { nospawn: true } } }, jshint: { all: { src: ['Gruntfile.js', 'lib/**/*.js'] } } }); // On watch events, inject only the changed files into the config grunt.event.on('watch', function(action, filepath) { grunt.config(['jshint', 'all', 'src'], [filepath]); }); 

这并不完全符合您的要求,因为它取决于您开始修改文件时即开始运行,但它可能更适合整体Grunt方法。

另请参阅此问题,但请注意其中的一些与旧版本的Grunt和coffeescript有关。

更新:现在有一个咕噜新的插件,以更优雅的方式处理所有这一切

为此使用grunt-newer 。 特别是将Grunt任务configuration为仅使用较新的文件运行。

例:

 grunt.initConfig({ jshint: { options: { jshintrc: '.jshintrc' }, all: { src: 'src/**/*.js' } } }); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-newer'); grunt.registerTask('lint', ['newer:jshint:all']);