我有一个grunt文件,其定义如下:
uglify: {
build: {
src: 'www/temp/application.js', // a concatenation of files via grunt-contrib-concat
dest: 'www/temp/application.min.js'
}
},
我真正想做的是仅在application.min.js
文件被更改的情况下重新计算最终application.js
。更确切地说,我想添加条件:
# pseudocode
if (getFileContents(application.js) == getFileContents(previously.uglified.application.js)) {
// do nothing
} else {
// run uglifying on application.js
}
原因:
答案 0 :(得分:1)
有几种可能的解决方案:
您可以创建自己的grunt任务,使用例如fs.stat检查文件的上次修改时间,然后通过grunt.task.run以准备好的选项作为参数运行uglify
任务。
或者您可以构建文件对象,通过过滤器函数动态传递它:
var fs = require('fs');
module.exports = function (grunt) {
function filterChanged(files) {
var mtime = '',
stats;
for (var dest in files) {
stats = fs.statSync(files[dest]);
try {
mtime = fs.readFileSync(files[dest] + '.mtime', 'utf8');
}
catch (ex) {
fs.writeFileSync(files[dest] + '.mtime', stats.mtime, 'utf8');
return files;
}
if (stats.mtime == mtime || !mtime) {
delete files[dest];
}
else {
fs.writeFileSync(files[dest] + '.mtime', stats.mtime, 'utf8');
}
}
return files;
}
grunt.initConfig({
uglify: {
build: {
files: filterChanged({
'www/temp/application.min.js': 'www/temp/application.js'
})
}
}
});
};
这会导致每次filterChanged
任务运行时调用uglify
函数。