Продолжайте выполнение определенных задач, даже если один из них
Есть ли способ настроить последовательность задач, чтобы конкретные последующие (я не хочу --force на всей партии) запускать, даже если один не удается? Например, рассмотрим такой случай
- Создание временных файлов
- Запустите некоторые модульные тесты, в которых задействованы временные файлы.
- Очистка этих временных файлов
Я могу это сделать:
grunt.registerTask('testTheTemp', ['makeTempFiles', 'qunit', 'removeTempFiles']);
Но если qunit не удается, задача removeTempFiles никогда не запускается.
Ответы
Ответ 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. В основном это приведет к сбою текущей задачи, если все указанные "требуемые" задачи уже не выполняются и не передаются.