2013-05-17 9 views
20

C'è un modo per configurare una sequenza di attività in modo che specifiche successive (non voglio --force sull'intero batch) vengano eseguite anche se una fallisce? Ad esempio, si consideri un caso come questoContinuare determinate attività in grunt anche se si fallisce

  1. Creare alcuni file temporanei
  2. eseguire alcuni test unitari che coinvolgono i file temporanei
  3. Clean up quei file temporanei

posso fare questo:

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

Ma se qunit non riesce, l'attività removeTempFiles non viene mai eseguita.

risposta

17

Ecco una soluzione alternativa. Non è carino, ma risolve il problema.

È possibile creare due attività aggiuntive che è possibile avvolgere all'inizio/alla fine di qualsiasi sequenza che si desidera continuare anche in caso di errore. Il controllo per il valore esistente di grunt.option('force') è tale da non sovrascrivere alcun --force passato dalla riga di comando.

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

Ho anche inviato uno feature request per Grunt per supportare questo in modo nativo.

+7

+1 per 'usetheforce': D –

+1

Esiste ormai un plugin per grunt: [grunt-force-task] (https://www.npmjs.com/package/grunt-force-task) – Marius

+0

Molto bella opzione. Mi piace perché puoi vedere chiaramente nella sequenza in cui stai forzando il flusso o meno. Bella soluzione! –

3

Forse è possibile creare un'attività di grugnito async e grunt.util.spawn le attività desiderate in serie. È quindi possibile scrivere una logica condizionale per i codici di successo/errore. Qualcosa di simile alla risposta a questo question

18

Per l'amor posteri, questo potrebbe essere un miglior mod mentre aspettiamo that PR da @explunit a sbarcare in grugnito:

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

Facendo eco commento Marius', il grunt-force-task plugin ora fornisce questa funzionalità. Tutti i dettagli seguendo il link qui sopra, ma in poche parole questo è ciò che è necessario per ottenere l'effetto desiderato

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

Quindi importare nella tua gruntfile

Infine, basta aggiungere la forza: prefix al compito (i) prima di quello che si desidera eseguire sempre.

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

Ora removeTempFiles verrà eseguito sempre anche se il test ha esito negativo.

1

L'unico problema con l'utilizzo di grunt-force-task plugin menzionato in precedenza è che il processo di grunt ora uscirà incondizionatamente con 0 (che significa passare).

Questo è un problema se si desidera utilizzare grunt in un ambiente CI (integrazione continua) e non rieseguire l'attività CI in base al fatto che il test/build (qunit nell'OP) passi o fallisca.Ho lavorato a questo problema con l'aggiunta di una nuova attività che utilizza la funzione di grugnito this.requires per verificare se qunit stato superato o meno:

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

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

Ora, se fallisce qunit grugnito uscirà con 3, che indica Task Error. Senza il exitWithQunitStatus, il processo grunt uscirà con 0.

this.requires è documentato qui: http://gruntjs.com/api/inside-tasks#this.requires. Fondamentalmente fallirà l'attività corrente a meno che tutte le attività "richieste" specificate non siano già state eseguite e passate.

+1

grunt-continue - https://www.npmjs.com/package/grunt-continue risolve anche questo problema – zayquan