2013-05-17 7 views
20

Gibt es eine Möglichkeit, eine Reihe von Aufgaben zu konfigurieren, so dass spezifische nachfolgende (ich will nicht --force auf den gesamten Batch) laufen, auch wenn man scheitert? Betrachten wir zum Beispiel einen Fall wie diesemWeiter bestimmte Aufgaben in Grunt, auch wenn einer fehlschlägt

  1. Erstellen Sie einige temporäre Dateien
  2. Run einige Unit-Tests, die diese temporären Dateien
  3. Abgleich diese temporären Dateien

Ich kann dies tun beinhalten:

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

Aber wenn qunit fehlschlägt, wird die removeTempFiles-Task nie ausgeführt.

Antwort

17

Hier ist eine Problemumgehung. Es ist nicht schön, aber es löst das Problem.

Sie erstellen zwei zusätzliche Aufgaben, die Sie am Anfang/Ende jeder Sequenz einfügen können, die Sie auch bei einem Fehler fortsetzen möchten. Die Prüfung auf vorhandenen Wert von grunt.option('force') ist so, dass Sie keine --force von der Befehlszeile übergeben überschreiben.

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

Ich habe legte auch einen feature request für Grunt diese nativ zu unterstützen.

+7

+1 für 'usetheforce': D –

+1

Es gibt inzwischen ein Grunt-Plugin dafür: [grunt-force-task] (https://www.npmjs.com/package/grunt-force-task) – Marius

+0

Sehr nette Option. Ich mag es, weil du in der Sequenz klar sehen kannst, wo du den Fluss erzwingst oder nicht. Schöne Lösung! –

3

Vielleicht können Sie eine async Grunt Aufgabe und grunt.util.spawn Ihre gewünschten Aufgaben seriell erstellen. Sie können dann eine bedingte Logik für die Erfolgs-/Fehlercodes schreiben. Ähnliches wie die Antwort auf diese question

18

Für die Nachwelt willen, könnte dies eine verbesserte Hack sein, während wir für that PR von @explunit warten in Grunzen zu landen:

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

Kommentar Marius Echoing, die grunt-force-task plugin bietet nun diese Funktionalität. Vollständige Details über den Link oben folgen, aber in aller Kürze das ist, was Sie den gewünschten Effekt

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

Dann importieren Sie es in Ihr gruntfile

Schließlich erreichen müssen, fügen Sie einfach die Kraft: prefix an die Aufgabe (n) vor der Aufgabe, die Sie immer ausführen möchten.

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

Jetzt removeTempFiles wird immer ausgeführt, auch wenn der Test fehlschlägt.

1

Das eine Problem mit der Verwendung der oben erwähnten grunt-force-task plugin ist, dass der Grunt-Prozess nun bedingungslos mit 0 (das heißt bestanden) beendet wird.

Dies ist ein Problem, wenn Sie grunt in einer CI-Umgebung (Continuous Integration) verwenden und die CI-Aufgabe basierend darauf abbrechen wollen, ob Ihr Test/Build (qunit im OP) erfolgreich ist oder fehlschlägt.Ich habe durch das Hinzufügen einer neuen Aufgabe, um dieses Problem gearbeitet, die this.requires Funktion Grunt verwendet, um zu testen, ob qunit bestanden oder nicht bestanden:

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

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

Nun, wenn qunit nicht grunzen mit 3 verlassen wird, die Task Error anzeigt. Ohne exitWithQunitStatus wird der Grunt-Prozess mit 0 beendet.

this.requires ist hier dokumentiert: http://gruntjs.com/api/inside-tasks#this.requires. Grundsätzlich wird die aktuelle Aufgabe fehlschlagen, es sei denn, alle angegebenen "erforderlichen" Aufgaben wurden bereits ausgeführt und bestanden.

+1

grunt-continue - https://www.npmjs.com/package/grunt-continue löst auch dieses Problem – zayquan