2016-02-26 15 views
13

Attualmente sto utilizzando un'attività di gulp per testare un progetto. Questo esegue le attività utilizzando i seguenti strumenti:Esecuzione di comandi multipli per il test npm

  • Karma (asincrona)
  • goniometro (processo generato)
  • ESlint (usando gulp-eslint)
  • HTMLHint (usando gulp-htmlhint)
  • Stylelint (usando gulp-postcss)

L'attività ha esito negativo se una di queste attività non è riuscita.

Tutti questi strumenti hanno interfacce Cli perfettamente funzionanti. Così ho deciso che mi piacerebbe eseguire questi strumenti utilizzando invece uno script di test npm.

Per semplicisticamente diciamo che tutti gli strumenti funzionano semplicemente richiamandoli senza alcun flag. Quindi questo può essere fatto utilizzando:

{ 
    ... 
    "scripts": { 
    "test": "karma && protractor && eslint && htmlhint && stylelint" 
    }, 
    ... 
} 

Tuttavia, questo significa che se karma fallisce, nessuno degli altri strumenti verrà eseguito.

È possibile creare una configurazione in cui verranno eseguiti tutti questi strumenti, ma npm test avrà esito negativo se uno dei comandi non è riuscito?

risposta

4

npm-run-all può anche gestire bene questo

È possibile eseguire NPM multipla comandi contemporaneamente, continuando su errore come segue:

npm-run-all --parallel --continue-on-error karma protractor eslint htmlhint stylelint

Opzioni come scritto nella documentazione:

-p, --parallel <tasks> - Run a group of tasks in parallel. 
          e.g. 'npm-run-all -p foo bar' is similar to 
           'npm run foo & npm run bar'. 
-c, --continue-on-error - Set the flag to continue executing other tasks 
          even if a task threw an error. 'run-p' itself 
          will exit with non-zero code if one or more tasks 
          threw error(s). 
+1

Attualmente preferisco questo al giorno d'oggi. –

11

Gli script tag package.json sono gestiti dalla shell, in modo da poter eseguire il comando che si desidera che la shell per eseguire:

"scripts": { 
    "test": "karma ; protractor ; eslint ; htmlhint ; stylelint" 
}, 

verrà eseguito tutti i comandi se si dispone di una shell UNIX/OSX.

Per poter conservare il codice di uscita come specificato, è necessario disporre di uno script separato per eseguire i comandi. Forse qualcosa di simile:

#!/bin/bash 

EXIT_STATUS=0 

function check_command { 
    "[email protected]" 
    local STATUS=$? 
    if [ $STATUS -ne 0 ]; then 
     echo "error with $1 ($STATUS)" >&2 
     EXIT_STATUS=$STATUS 
    fi 
} 

check_command karma 
check_command protractor 
check_command eslint 
check_command htmlhint 
check_command stylelint 
exit $EXIT_STATUS 
+0

Questo verrà eseguito tutti i comandi, ma si uscirà con il codice esistono dell'ultimo comando, ignorando eventuali codici di uscita precedente. Quindi in questo caso tutti i test falliti saranno ignorati. –

+0

Ho aggiunto un esempio di questo ora. – bolav

+0

Si noti che lo script 'test' nel primo esempio non supporta Windows, la sintassi'; 'non è valida in PowerShell. –

7

concurrently è una bella libreria in grado di gestire questo. Può essere installato da npm.

npm install --save-dev concurrently 

Quando ogni sezione viene ordinato come uno script separato, la sezione degli script di package.json sembra un po 'come questo:

{ 
    ... 
    "scripts": { 
    "test": "concurrently 'npm run karma' 'npm run protractor' 'npm run eslint' 'npm run htmlhint' 'npm run stylelint'", 
    "karma": "karma start --single-run", 
    "protractor": "protractor", 
    "eslint": "eslint .", 
    "htmlhint": "htmlhint 'app/**/*.html'", 
    "stylelint": "stylelint 'app/**/*.css'", 
    }, 
    ... 
} 
+2

'' '" test ":" simultaneamente 'npm eseguire karma' 'npm eseguire goniometro' 'npm eseguire eslint' 'npm eseguire htmlhint' 'npm eseguire stylelint' "' '' dovrebbe essere '' '" test ":" simultaneamente \ "npm eseguire karma \" \ "npm eseguire il goniometro \" \ "npm eseguire eslint \" \ "npm eseguire htmlhint \" \ "npm eseguire stylelint \" "' '' su windows. – lfree