Gruntjs 即使前一个任务失败,也无条件运行grunt任务,但保留失败的退出代码

Gruntjs 即使前一个任务失败,也无条件运行grunt任务,但保留失败的退出代码,gruntjs,protractor,Gruntjs,Protractor,认为这是一个足够普遍的问题,可以通过自我回答的问题来分享 一般情况 我有一个可能通过或失败的主要任务,我需要无条件地运行一个单独的任务作为拆卸 我还需要grunt使用主任务的通过/失败状态最终退出 具体场景 在运行量角器之前,我需要做一些设置 运行量角器后,我需要进行一些拆卸 设置和拆卸已经够复杂了,在量角器onPrepare和onCleanup块中执行这些任务我已经不舒服了 我想将这些设置和拆卸建模为在量角器作业之前和之后运行的单独grunt任务 无论量角器通过/失败,我每次都需要运行拆卸

认为这是一个足够普遍的问题,可以通过自我回答的问题来分享

一般情况

我有一个可能通过或失败的主要任务,我需要无条件地运行一个单独的任务作为拆卸

我还需要grunt使用主任务的通过/失败状态最终退出

具体场景

  • 在运行量角器之前,我需要做一些设置
  • 运行量角器后,我需要进行一些拆卸
  • 设置和拆卸已经够复杂了,在量角器onPrepare和onCleanup块中执行这些任务我已经不舒服了
  • 我想将这些设置和拆卸建模为在量角器作业之前和之后运行的单独grunt任务
  • 无论量角器通过/失败,我每次都需要运行拆卸
  • 我需要grunt任务的最终退出代码来表示量角器的通过/失败
假设我有一个名为E2E的任务(用于使用量角器进行E2E测试):

尝试1:

grunt.registerTask('E2E', ['setupProtractorEnvironment', 'protractor', 'teardownProtractorEnvironment']);
如果量角器失败,则不运行拆卸

尝试2:添加grunt force任务

我可以使用以下方法解决部分问题:

grunt.registerTask('E2E', ['setupProtractorEnvironment', 'force:protractor', 'teardownProtractorEnvironment']);
现在,无论量角器是否失败,TeardownDrugatorEnvironment将始终运行,但退出代码现在始终为0

尝试3:使用grunt this.requires()

现在,当量角器失败时,拆卸仍会运行,但退出代码为3(任务错误)

如果我想在CI中使用这个grunt任务,并在量角器E2E失败时失败构建,那么最后的错误代码很重要


如问题尝试3所示,您可以添加一个新任务,该任务使用grunt的
this.requires()
来测试以前任务的状态


此。此处记录了所需的
:。基本上,除非所有指定的“必需”任务都已运行并通过,否则它将无法完成当前任务。

感谢您的这篇文章,即使在将近4年后,它也非常有用。我想补充的一件事是确保在这个.requires()中使用正确的任务名称。当我应该使用“jshint:files”时,我正在使用“jshint”
grunt.registerTask('exitWithProtractorStatus', function() {
  this.requires(['protractor']);
  return true;
})

grunt.registerTask('E2E', ['setupProtractorEnvironment', 'force:protractor', 'teardownProtractorEnvironment', 'exitWithProtractorStatus']);