2016-02-26 10 views
13

Ich verwende derzeit eine Schluckaufgabe, um ein Projekt zu testen. Dies läuft Aufgaben die folgenden Tools:Ausführen mehrerer Befehle für den npm-Test

  • Karma (async)
  • Protractor (erzeugten Prozess)
  • ESlint (mit gulp-eslint)
  • HTMLHint (mit gulp-htmlhint)
  • Stylelint (mit gulp-postcss)

Die Task schlägt fehl, wenn eine dieser Tasks fehlgeschlagen ist.

Alle diese Werkzeuge haben perfekt feine CLI-Schnittstellen. Also entschied ich, dass ich diese Tools lieber mit einem npm-Testskript ausführen würde.

Für simplicitly lassen Sie uns sagen, dass alle Tools durch einfaches Aufrufen ohne Flags ausgeführt werden. Dann kann dies über getan werden:

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

Dies bedeutet jedoch, dass, wenn karma ausfällt, keiner der anderen Tools ausgeführt wird.

Ist es möglich, ein Setup zu erstellen, bei dem alle diese Tools ausgeführt werden, aber npm test schlägt fehl, wenn einer der Befehle fehlschlägt?

Antwort

4

npm-run-all auch dieses gut

umgehen können Sie mehrere npm ausführen können Befehle gleichzeitig, weiterhin bei Fehler wie folgt:

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

Optionen wie in der Dokumentation geschrieben:

-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

Ich bevorzuge diesen heutzutage sogar gleichzeitig. –

11

Die Skripte Tags in package.json werden von der Shell ausgeführt werden, so dass Sie den Befehl ausführen kann, dass die Shell ausgeführt werden soll: alle Befehle

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

Wird ausgeführt, wenn Sie einen Unix/OSX Shell haben.

Um den exit_code wie von Ihnen angegeben beizubehalten, benötigen Sie ein separates Skript, um die Befehle auszuführen. Vielleicht so etwas wie folgt aus:

#!/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

Dadurch werden alle Befehle ausführen, aber es wird mit dem EXIST-Code des letzten Befehl beenden, alle vorherigen Exit-Codes zu ignorieren. In diesem Fall werden alle fehlgeschlagenen Tests ignoriert. –

+0

Ich habe jetzt ein Beispiel dafür hinzugefügt. – bolav

+0

Beachten Sie, dass das Skript 'test' im ersten Beispiel Windows nicht unterstützt, da die Syntax' '' in PowerShell ungültig ist. –

7

concurrently ist eine schöne Bibliothek, die damit umgehen können. Es kann von npm installiert werden.

npm install --save-dev concurrently 

Wenn jeder Abschnitt als separates Skript sortiert ist, sucht der Skripte Abschnitt package.json ein bisschen wie folgt aus:

{ 
    ... 
    "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 ":" gleichzeitig "npm run karma '' npm run Winkelmesser '' npm run eslint '' npm run htmlhint '' npm run stylinint '" '' 'sollte' '' "test": "gleichzeitig sein "npm run karma \" \ npm run winkelmesser \ "npm lauf eslint \" npm lauf htmlhint \ "npm run stylelint \" "" auf windows. – lfree

Verwandte Themen