So legen Sie die Shell für npm-Run-Skripte in Windows fest

82

Ich führe npm unter Windows aus und möchte parallele Operationen in Run-Skripten verwenden und formatieren, aber die parallele Ausführung in cmd ist in meiner Datei package.json, die ich schreiben möchte, etwas chaotisch.

scripts: { "go": "cmd1 & cmd2"} 

Aber npm führt das Skript unter cmd.exe aus, von dem nicht bekannt ist, dass ; ich es in Skripte ändern könnte: { "go": "bats/bat1.bat")Dabei ist bat1.bat eine cmd bat-Datei, die den Windows-Aufruf oder Startbefehle verwendet, um Befehle parallel auszuführen. Das funktioniert, gibt mir aber ein Skript, das nur unter Windows funktioniert.

Es wäre viel einfacher, wenn ich npm dazu bringen könnte, das Skript unter einem Bash-Klon oder Cygwin auszuführen.

Ich habe es versucht, config: { "shell": "bash"} aber das lief immer noch cmd.exe

Gibt es eine Möglichkeit, npm anzuweisen, Skripte mit einer bestimmten Shell (nicht cmd.exe) auszuführen?

user2129444
quelle
Ist es [noch] nicht möglich, eine Shell in package.json anzugeben? Ich verwende npm sowohl für Windows- als auch für Bash-Skripte und habe keine Möglichkeit, die Standardeinstellungen für "Shell" oder "Script-Shell" für ein bestimmtes package.json zu überschreiben.
Corey Alix

Antworten:

153

Seit npm 5.1

npm config set script-shell "C:\\Program Files (x86)\\git\\bin\\bash.exe"  

oder (64-Bit-Installation)

npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"

Beachten Sie, dass Git für Windows installiert sein muss .

Sie können es zurücksetzen, indem Sie Folgendes ausführen:

npm config delete script-shell
DuncanSungWKim
quelle
8
Dies sollte die akzeptierte Antwort sein! Funktioniert unter Windows 10 mit Git Bash (VS-Code enthalten).
Alex Vang
7
npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe"ist die Antwort auf alle meine Probleme beim Ausführen paralleler Skripts unter Windows 10 64-Bit. @DuncanSungWKim 감사 합니다 dafür.
TaeKwonJoe
Danke, ich hatte ein Problem mit npm start, das in cmd, aber nicht in bash funktionierte, und ich habe das von Ihnen vorgeschlagene Skript ausgeführt und es hat funktioniert !!!! Nach zwei Tagen googeln für eine Antwort .... -_- Danke für die Hilfe
AlonSamuel
2
Wenn ich mich bereits in einer Git-Bash-Shell befinde und npm run <scriptmit dieser Konfiguration ausgeführt werde, wird ein neues Git-Bash-Fenster erzeugt, in dem das Skript ausgeführt wird. Das will ich nicht. Gibt es eine Möglichkeit, die Shell innerhalb der aufrufenden Shell einfach aufzurufen?
JHH
2
@JHH - Ich hatte auch Shells, die von vscode geöffnet wurden, weil ich git-bash.exe anstelle von bash.exe verwendete. Als ich das Problem behoben habe, dass vscode bash mit dem script-shell bash identisch war, wurde das Problem behoben.
Corey Alix
28

Hier ist eine Möglichkeit, dies zu tun:

  1. Erstellen Sie ein Skript wie my_script.sh in Ihrem Projekt-Bin-Verzeichnis.
  2. Fügen Sie in Ihrer Datei package.json eine Zeile hinzu, um das Skript mit bash auszuführen. Zum Beispiel:

    "scripts": {
      "boogie": "bash bin/my_script.sh"
    }
    

Jetzt können Sie Ihr Bash-Skript von npm aus ausführen, indem Sie:

    npm run-script boogie

Nicht sehr elegant, aber es funktioniert.

Wenn Sie sowohl unter Windows als auch unter Linux / Unix entwickeln, ist dieser Ansatz zumindest für beide Umgebungen ziemlich portabel.

Craig Johannsen
quelle
3
Eine weitere Option: "scripts": { "start": "node ./bin/www", "bash": "bash -c", "ls": "npm run bash ls" }
Cchamberlain
16

Im Idealfall sollte das Überschreiben des Konfigurationsparameters npm shell funktionieren, aber npm (mindestens Version 1.4.14) scheint in Windows die Einstellung zu ignorieren und stattdessen cmd.exe zu verwenden.

Verwenden Sie den folgenden Befehl in Ihrer Bash- oder Git Bash-Shell, um die Shell-Einstellung herauszufinden:

$ npm config ls -l | grep shell

Standardmäßig lautet die Ausgabe:

shell = "C:\\WINDOWS\\system32\\cmd.exe"

Um den Standard-Shell-Parameter zu überschreiben, können Sie jedoch eine npmrc-Datei zum Verzeichnis \ Users \ yourusername \ AppData \ Roaming \ npm \ etc hinzufügen (oder bearbeiten). Fügen Sie einfach die folgende Zeile hinzu:

shell = "C:\\Program Files (x86)\\git\\bin\\bash.exe"

Der von Ihnen verwendete Pfad kann ein beliebiger gültiger Pfad zu bash.exe sein. Wenn Sie nun den obigen Befehl "npm config ls -l | grep shell" ausführen, wird die folgende Ausgabe angezeigt, die angibt, dass der Shell-Parameter überschrieben wurde:

shell = "C:\\Program Files (x86)\\git\\bin\\bash.exe"
; shell = "C:\\WINDOWS\\system32\\cmd.exe" (overridden)

Vielleicht wird eines Tages eine neue Version von npm auf den überschriebenen Shell-Parameter achten.

Craig Johannsen
quelle
1
Ich wünschte, das hätte funktioniert. Ich habe die COMSPEC-Umgebungsvariable geändert und sie scheint sich daraus zu ergeben, aber ich konnte sie nicht richtig zum Laufen bringen.
Cchamberlain
4
Dies macht den gleichen Job:$ npm config set shell "C:\\msys64\\usr\\bin\\bash"
Kwarnke
Ich habe mein Problem auf Ihren Vorschlag hin gelöst. Jetzt kann ich Skripte auf npm ausführen, die mehr durch ;Windows getrennte Befehle enthalten. Im Ordner C: \ Benutzer \ Benutzername \ habe ich .npmrcshell = "C:\\Program Files\\Git\\bin\\bash.exe" script-shell = "C:\\Program Files\\Git\\bin\\bash.exe"
iFederx
2

Verwenden Sie einfach CMDs Art zu laufen .bat!

.json
"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject",
    "app": "cd build & browser-sync start --server --files 'index.html'",
    "bat": "start start-browser.bat",
    "starts": "start http://localhost:7777/datas/ && start http://localhost:7777/Info/"
},
.Schläger
start http://localhost:7777/datas/ && start http://localhost:7777/Info/
Qwerty
quelle
1

Verwenden Sie zu diesem Zweck ein speziell erstelltes node_module. Ich schlage vor, npm-run-all zu verwenden , aber es gibt andere , wie z. B. Parallelen .

Das folgende Parallelshell-Beispiel dient als Ersatz für Ihre Frage.

"scripts": {
    "parallelexample1": "parallelshell \"echo 1\" \"echo 2\" \"echo 3\""
},

folgenden Befehl:

npm run parallelexample1

funktioniert sowohl unter Windows als auch unter Unix (Linux / MacOS).

Interessanterweise unterstützt npm-run-all keine Shell-Befehle. Daher müssen wir alle Shell-Befehle in separate Skripte wie unten setzen.

"scripts": {
   "parallelexample2": "npm-run-all echo*",
    "echo1": "echo 1",
    "echo2": "echo 2",
    "echo3": "echo 3"
},

Folgende Anweisung:

npm run parallelexample2

funktioniert sowohl unter Windows als auch unter Unix (Linux / MacOS).

Atilla Ozgur
quelle
Vielen Dank für den Tipp für npm-run-all, ich habe auch die --parallelOption ausprobiert
Brandon Søren Culley
1

In meinem Fall musste ich nur npm startaus Bash heraus rennen . Ich renne, cmddann öffne ich Bash, indem ich renne "c:\Program Files\Git\bin\bash.exe". Unter Bash - Shell konnte ich dann anrufen npm buildund npm starterfolgreich.

Möglicherweise haben Sie bereits Bash, wenn Sie Git verwenden. Wenn nicht, können Sie installieren .

Hoffe, das kann jemandem Zeit sparen.

Mike Keskinov
quelle
Funktioniert nicht mit allen Skripten, die unter Linux funktionieren, wie zum Beispiel mitPORT=8000
shinzou
0

Sie können auch plattformübergreifende Powershell https://github.com/powershell/powershell#get-powershell für npm-Skripte verwenden.

Führen Sie dies im Projektstammordner aus, um ein einzelnes Projekt festzulegen:

npm config set script-shell pwsh --userconfig ./.npmrc

So setzen Sie global für alle Knotenprojekte:

npm config set script-shell pwsh [--global]
GorvGoyl
quelle