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-也解决了这个问题