我们正在重构一个非常大的网站上的代码。我想对任何改变的文件强制执行linting,但忽略其余的文件(因为其中许多文件最终会被删除,所以浪费时间来整理它们。)
我想要有一个咕噜咕噜的任务,检查文件的修改日期是否比它创建的更新(*从repo获取)日期更新,并且如果是这种情况则将其删除(也可以将grunt更新为json要删除的文件列表。
除了grunt及其插件之外,我还没有使用节点。我将使用http://gruntjs.com/creating-tasks作为起点,但是有人可以为我绘制如何编写此任务的方法,特别是与异步性有关的任何注意事项。
答案 0 :(得分:10)
几个选项:
1 - 您可以使用custom filter function过滤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 plugin检测文件何时发生变化。然后你可以阅读事件中的文件列表,如Kyle Robinson Young(“shama”)的this comment中所述:
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方法。
另请参阅this question,但要注意其中一些与旧版本的Grunt和coffeescript有关。
更新:现在有一个grunt-newer插件可以更优雅的方式处理所有这些
答案 1 :(得分:1)
使用grunt-newer。 特别是将Grunt任务配置为仅与较新的文件一起运行。
示例:
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']);