Подтвердить что ты не робот

Продолжайте выполнение определенных задач, даже если один из них

Есть ли способ настроить последовательность задач, чтобы конкретные последующие (я не хочу --force на всей партии) запускать, даже если один не удается? Например, рассмотрим такой случай

  • Создание временных файлов
  • Запустите некоторые модульные тесты, в которых задействованы временные файлы.
  • Очистка этих временных файлов

Я могу это сделать:

grunt.registerTask('testTheTemp', ['makeTempFiles', 'qunit', 'removeTempFiles']);

Но если qunit не удается, задача removeTempFiles никогда не запускается.

4b9b3361

Ответ 1

Вот один способ обхода. Это не очень, но это решает проблему.

Вы создаете две дополнительные задачи, которые вы можете обернуть в начале/конце любой последовательности, которую вы хотите продолжить даже после сбоя. Проверка существующего значения 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 для этого.

Ответ 2

Для потомков это может быть улучшенный взлом, пока мы ждем этого PR из @explunit, чтобы приземлиться:

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"
]);

Ответ 3

Возможно, вы можете создать async задание grunt и grunt. util.spawn ваши желаемые задачи поочередно. Затем вы можете написать некоторую условную логику для кодов успеха/ошибок. Что-то похожее на ответ на этот question

Ответ 4

Повторяя комментарий Marius, плагин-сила-задача-плагин теперь предоставляет эту функцию. Полная информация, следуя приведенной выше ссылке, но в двух словах это то, что вам нужно для достижения желаемого эффекта.

npm install grunt-force-task --save-dev

Затем импортируйте его в свой файл grunt

grunt.loadNpmTasks('grunt-force-task');

Наконец, просто добавьте силу: префикс к задаче (задачам) перед тем, который вы всегда хотите запустить.

grunt.registerTask('testTemp', ['makeTempFiles', 'force:qunit', 'removeTempFiles']);

Теперь removeTempFiles всегда будет работать, даже если сбой теста.

Ответ 5

Единственная проблема с использованием плагина-силы-задачи-задачи, упомянутого выше, заключается в том, что процесс ворчания теперь безоговорочно завершится с 0 (что означает проходить).

Это проблема, если вы хотите использовать grunt в среде CI (непрерывной интеграции) и не выполнить задачу CI на основе того, проходит или не проходит ваш тест/сборка (qunit в OP). Я работал над этой проблемой, добавив новую задачу, которая использует функцию grunt this.requires для проверки того, прошло или не прошло qunit:

grunt.registerTask('exitWithQunitStatus', function() {
  this.requires(['qunit']);
  return true;
})

grunt.registerTask('testTheTemp', ['makeTempFiles', 'force:qunit', 'removeTempFiles', 'exitWithQunitStatus']);

Теперь, если qunit fail grunt завершится с 3, что означает Task Error. Без exitWithQunitStatus процесс grunt завершится с 0.

this.requires приведено здесь: http://gruntjs.com/api/inside-tasks#this.requires. В основном это приведет к сбою текущей задачи, если все указанные "требуемые" задачи уже не выполняются и не передаются.