Gruntjs 如果某些文件发生更改,则在grunt中有条件地运行任务
我是Grunt的新手,从我的理解到现在,Grunt有一个“监视”任务,它不断检查文件的修改,每次修改发生时,都运行相应的任务 我正在寻找的是一种离散版本的任务,它将运行其他任务,如果且仅当自上次构建以来某些文件发生了更改 这似乎是很自然的要求,但我找不到这个。只是我,还是这真的是个问题 配置文件应如下所示:Gruntjs 如果某些文件发生更改,则在grunt中有条件地运行任务,gruntjs,Gruntjs,我是Grunt的新手,从我的理解到现在,Grunt有一个“监视”任务,它不断检查文件的修改,每次修改发生时,都运行相应的任务 我正在寻找的是一种离散版本的任务,它将运行其他任务,如果且仅当自上次构建以来某些文件发生了更改 这似乎是很自然的要求,但我找不到这个。只是我,还是这真的是个问题 配置文件应如下所示: grunt.initConfig({ foo: { files: "foo/*" // some task }, bar: { files: "bar/*
grunt.initConfig({
foo: {
files: "foo/*"
// some task
},
bar: {
files: "bar/*"
// some other task
},
ifModified: {
foo: {
files: "foo/*",
tasks: ['foo']
},
bar: {
files: 'bar/*',
tasks: ['bar', 'foo']
}
}
});
grunt.registerTask('default', ['bar', 'foo']);
运行
grunt
应始终执行任务'bar',foo'
,而运行grunt ifModified
应仅在某些文件自上一次生成以来实际发生更改时才执行任何任务。您可以创建一个有条件运行其他任务的任务,从:
grunt.registerTask('foo','My“foo”task',function(){
//将“bar”和“baz”任务排队,以便在“foo”完成后按顺序运行。
grunt.task.run('bar','baz');
//或:
run(['bar','baz']);
});
您可以从以下位置创建一个有条件运行其他任务的任务:
grunt.registerTask('foo','My“foo”task',function(){
//将“bar”和“baz”任务排队,以便在“foo”完成后按顺序运行。
grunt.task.run('bar','baz');
//或:
run(['bar','baz']);
});
为此制定了我自己的任务。其实并不难,下面是代码:
build/tasks/if-modified.js:
var fs = require('fs');
var crypto = require('crypto');
module.exports = function (grunt) {
grunt.registerMultiTask('if-modified', 'Conditionally running tasks if files are changed.', function () {
var options = this.options({});
grunt.verbose.writeflags(options, 'Options');
var hashes = {};
if (grunt.file.exists(options.hashFile)) {
try {
hashes = grunt.file.readJSON(options.hashFile);
}
catch (err) {
grunt.log.warn(err);
}
}
grunt.verbose.writeflags(hashes, 'Hashes');
var md5 = crypto.createHash('md5');
this.files.forEach(function (f) {
f.src.forEach(function (filepath) {
var stats = fs.statSync(filepath);
md5.update(JSON.stringify({
filepath: filepath,
isFile: stats.isFile(),
size: stats.size,
ctime: stats.ctime,
mtime: stats.mtime
}));
});
});
var hash = md5.digest('hex');
grunt.verbose.writeln('Hash: ' + hash);
if (hash != hashes[this.target]) {
grunt.log.writeln('Something changed, executing tasks: ' + JSON.stringify(options.tasks));
grunt.task.run(options.tasks);
hashes[this.target] = hash;
grunt.file.write(options.hashFile, JSON.stringify(hashes));
}
else
grunt.log.writeln('Nothing changed.');
});
};
Grunfile.js:
grunt.initConfig({
foo: {
src: ["foo/**/*"],
dest: "foo-dest"
// some task
},
bar: {
src: ["bar/**/*", "foo-dest"]
// some other task
},
'if-modified': {
options: {
hashFile: 'build/hashes.json'
},
foo: {
src: ['foo/**/*', 'Gruntfile.js', 'package.json'],
options: {tasks: ['foo']}
},
bar: {
src: ['bar/**/*', "foo-dest", 'Gruntfile.js', 'package.json'],
options: {tasks: ['bar']}
}
}
});
grunt.loadTasks('build/tasks'); // if-modified.js in this dir
grunt.registerTask('default', ['foo', 'bar']);
运行:
为此我做了自己的任务。其实并不难,下面是代码: build/tasks/if-modified.js:
var fs = require('fs');
var crypto = require('crypto');
module.exports = function (grunt) {
grunt.registerMultiTask('if-modified', 'Conditionally running tasks if files are changed.', function () {
var options = this.options({});
grunt.verbose.writeflags(options, 'Options');
var hashes = {};
if (grunt.file.exists(options.hashFile)) {
try {
hashes = grunt.file.readJSON(options.hashFile);
}
catch (err) {
grunt.log.warn(err);
}
}
grunt.verbose.writeflags(hashes, 'Hashes');
var md5 = crypto.createHash('md5');
this.files.forEach(function (f) {
f.src.forEach(function (filepath) {
var stats = fs.statSync(filepath);
md5.update(JSON.stringify({
filepath: filepath,
isFile: stats.isFile(),
size: stats.size,
ctime: stats.ctime,
mtime: stats.mtime
}));
});
});
var hash = md5.digest('hex');
grunt.verbose.writeln('Hash: ' + hash);
if (hash != hashes[this.target]) {
grunt.log.writeln('Something changed, executing tasks: ' + JSON.stringify(options.tasks));
grunt.task.run(options.tasks);
hashes[this.target] = hash;
grunt.file.write(options.hashFile, JSON.stringify(hashes));
}
else
grunt.log.writeln('Nothing changed.');
});
};
Grunfile.js:
grunt.initConfig({
foo: {
src: ["foo/**/*"],
dest: "foo-dest"
// some task
},
bar: {
src: ["bar/**/*", "foo-dest"]
// some other task
},
'if-modified': {
options: {
hashFile: 'build/hashes.json'
},
foo: {
src: ['foo/**/*', 'Gruntfile.js', 'package.json'],
options: {tasks: ['foo']}
},
bar: {
src: ['bar/**/*', "foo-dest", 'Gruntfile.js', 'package.json'],
options: {tasks: ['bar']}
}
}
});
grunt.loadTasks('build/tasks'); // if-modified.js in this dir
grunt.registerTask('default', ['foo', 'bar']);
运行:
您需要的可能是grunt更新的: 较新的任务将配置另一个任务以使用src文件运行,src文件a)比dest文件更新,或b)比上次成功运行的src文件更新(如果没有dest文件)。有关示例和更多详细信息,请参见下文
您需要的可能是全新的: 较新的任务将配置另一个任务以使用src文件运行,src文件a)比dest文件更新,或b)比上次成功运行的src文件更新(如果没有dest文件)。有关示例和更多详细信息,请参见下文
是的,我看到了。在这种情况下,问题是如何检查集合“foo/*”中的某些文件自上次生成以来是否已更改?可以帮助您检测文件更改并存储结果我不认为已经有像grunt contrib watch这样的插件用于您的用例是的,我看到了。在这种情况下,问题是如何检查集合“foo/*”中的某些文件自上次生成以来是否已更改?可以帮助您检测文件更改,并且您应该存储结果。我认为对于您的用例,可能还没有grunt contrib watch这样的插件。虽然较新任务的第一次提交时间比提出此问题晚了2个月。谢谢,我会在有时间的时候研究grunt更新版,也许会切换到这个解决方案。它可能是。虽然较新任务的第一次提交时间比提出此问题晚了2个月。谢谢,我会在有时间的时候研究grunt更新版,也许会切换到这个解决方案。