Javascript 即使失败,也要在grunt中继续执行某些任务
有没有一种方法可以配置一系列任务,这样即使一个任务失败,后续任务(我不想强制整个批处理)也可以运行?例如,考虑这样一个例子Javascript 即使失败,也要在grunt中继续执行某些任务,javascript,gruntjs,grunt-contrib-qunit,Javascript,Gruntjs,Grunt Contrib Qunit,有没有一种方法可以配置一系列任务,这样即使一个任务失败,后续任务(我不想强制整个批处理)也可以运行?例如,考虑这样一个例子 创建一些临时文件 运行一些涉及这些临时文件的单元测试 清理那些临时文件 我可以这样做: grunt.registerTask('testTheTemp', ['makeTempFiles', 'qunit', 'removeTempFiles']); 但是如果qunit失败,那么removeTempFiles任务将永远不会运行。也许您可以创建一个grunt任务,并连续创建
grunt.registerTask('testTheTemp', ['makeTempFiles', 'qunit', 'removeTempFiles']);
但是如果qunit失败,那么removeTempFiles任务将永远不会运行。也许您可以创建一个grunt任务,并连续创建所需的任务。然后,您可以为成功/错误代码编写一些条件逻辑。类似于此的答案,这里有一个解决方法。这并不漂亮,但确实解决了问题 您可以创建两个额外的任务,这些任务可以在任何序列的开始/结束处进行包装,即使在出现故障时也可以继续。检查
grunt.option('force')
的现有值,这样您就不会覆盖从命令行传递的任何--force
grunt.registerTask('usetheforce_on',
'force the force option on if needed',
function() {
if ( !grunt.option( 'force' ) ) {
grunt.config.set('usetheforce_set', true);
grunt.option( 'force', true );
}
});
grunt.registerTask('usetheforce_restore',
'turn force option off if we have previously set it',
function() {
if ( grunt.config.get('usetheforce_set') ) {
grunt.option( 'force', false );
}
});
grunt.registerTask( 'myspecialsequence', [
'usetheforce_on',
'task_that_might_fail_and_we_do_not_care',
'another_task',
'usetheforce_restore',
'qunit',
'task_that_should_not_run_after_failed_unit_tests'
] );
我还为Grunt提交了一份本地支持文件。为了子孙后代,在我们等待@explunit在Grunt中登陆时,这可能是一个改进的黑客:
var previous_force_state = grunt.option("force");
grunt.registerTask("force",function(set){
if (set === "on") {
grunt.option("force",true);
}
else if (set === "off") {
grunt.option("force",false);
}
else if (set === "restore") {
grunt.option("force",previous_force_state);
}
});
// .....
grunt.registerTask("foobar",[
"task1",
"task2",
"force:on", // temporarily turn on --force
"task3", // will run with --force in effect
"force:restore",// restore previous --force state
"task4"
]);
响应马吕斯的评论,现在提供了这个功能。按照上面的链接提供完整的详细信息,但简而言之,这是实现所需效果所需的
npm install grunt-force-task --save-dev
然后将其导入GrunFile
grunt.loadNpmTasks('grunt-force-task');
最后,只需将force:前缀添加到始终要运行的任务之前
grunt.registerTask('testTemp', ['makeTempFiles', 'force:qunit', 'removeTempFiles']);
现在,即使测试失败,removeTempFiles也将始终运行。使用上述方法的一个问题是grunt进程现在将以0(即通过)无条件退出 如果您希望在CI(持续集成)环境中使用grunt,并根据您的测试/构建(
quonit
在OP中)是通过还是失败而使CI任务失败,则这是一个问题。我已经解决了这个问题,添加了一个使用grunt的this的新任务。需要函数来测试qunit
是否通过:
grunt.registerTask('exitWithQunitStatus', function() {
this.requires(['qunit']);
return true;
})
grunt.registerTask('testTheTemp', ['makeTempFiles', 'force:qunit', 'removeTempFiles', 'exitWithQunitStatus']);
现在,如果qunit
失败,grunt将以3退出,这表示任务错误
。如果没有exitWithQunitStatus
,grunt进程将以0退出
此。此处记录了所需的
:。基本上,它将使当前任务失败,除非所有指定的“必需”任务都已运行并通过。现在有一个grunt插件:非常好的选项。我喜欢它,因为你可以清楚地看到你是否在强迫流动。很好的解决方案!grunt continue-也解决了这个问题