Jak ustawić powłokę dla skryptów uruchomieniowych npm w systemie Windows

86

Używam npm w systemie Windows i chciałbym używać i stylizować operacje równoległe w skryptach uruchamiania, ale równoległe uruchamianie w cmd jest trochę niechlujne w moim pliku package.json, który chciałbym napisać-

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

ale npm wykonuje skrypt pod cmd.exe, który nie wie, ; że mógłbym to zmienić na skrypty: { "go": "bats/bat1.bat")gdzie bat1.bat jest plikiem cmd bat, który używa wywołań stylu Windows lub poleceń uruchamiania, aby uruchamiać polecenia równolegle. co działa, ale daje mi skrypt, który działa tylko w systemie Windows.

Byłoby o wiele prostsze, gdybym mógł uzyskać npm, aby uruchomić skrypt pod klonem bash lub cygwin.

Próbowałem, config: { "shell": "bash"} ale nadal działał cmd.exe

Czy istnieje sposób, aby nakazać npm uruchamianie skryptów przy użyciu określonej powłoki (nie cmd.exe)?

user2129444
źródło
Czy [nadal] nie jest możliwe określenie powłoki w package.json? Używam npm zarówno dla okien, jak i skryptów bash i nie mam możliwości zastąpienia domyślnych ustawień "powłoki" lub "powłoki skryptu" dla konkretnego pliku package.json?
Corey Alix

Odpowiedzi:

163

Ponieważ npm 5.1

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

lub (instalacja 64-bitowa)

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

Pamiętaj, że musisz mieć zainstalowany program git dla systemu Windows .

Możesz go cofnąć, uruchamiając:

npm config delete script-shell
DuncanSungWKim
źródło
9
To powinna być akceptowana odpowiedź! Działa na Windows 10 z Git Bash (w zestawie VS Code).
Alex Vang,
7
npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe"jest odpowiedzią na wszystkie moje problemy z uruchamianiem równoległych skryptów w systemie Windows 10 64-bit. @DuncanSungWKim 감사 합니다 do tego.
TaeKwonJoe
Dzięki, miałem problem z uruchomieniem npm, który działał w cmd ale nie w bashu i uruchomiłem skrypt, który zasugerowałeś i zadziałał !!!! Po dwóch dniach szukania odpowiedzi w Google… -_- Dzięki za pomoc
AlonSamuel.
2
Jeśli jestem już w powłoce git bash i działam npm run <scriptz tą konfiguracją, nowe okno git bash jest tworzone z uruchomieniem skryptu. Nie tego chcę. Czy istnieje sposób, aby po prostu wywołać powłokę wewnątrz wywołującej powłoki?
JHH
2
@JHH - Miałem też otwierane powłoki z vscode, ponieważ używałem git-bash.exe zamiast bash.exe. Kiedy naprawiłem, więc bash vscode był taki sam jak bash powłoki skryptu, problem został rozwiązany.
Corey Alix
28

Oto jeden sposób, aby to zrobić:

  1. Utwórz skrypt, taki jak my_script.sh, w katalogu bin projektu.
  2. W pliku package.json dodaj wiersz uruchamiający skrypt przy użyciu bash. Na przykład:

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

Teraz możesz uruchomić swój skrypt bash z npm przez:

    npm run-script boogie

Niezbyt eleganckie, ale działa.

Jeśli tworzysz zarówno w systemie Windows, jak i Linux / Unix, to przynajmniej takie podejście jest dość przenośne w obu środowiskach.

Craig Johannsen
źródło
3
Inna opcja: "scripts": { "start": "node ./bin/www", "bash": "bash -c", "ls": "npm run bash ls" }
cchamberlain
17

W idealnym przypadku zastąpienie parametru konfiguracji powłoki npm powinno działać, ale npm (co najmniej wersja 1.4.14) wydaje się w systemie Windows zignorować ustawienie i zamiast tego użyć cmd.exe.

Użyj następującego polecenia w powłoce bash lub Git Bash, aby sprawdzić ustawienie powłoki:

$ npm config ls -l | grep shell

Domyślnie wynik będzie następujący:

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

Jednak aby zastąpić domyślny parametr powłoki, możesz dodać (lub edytować) plik npmrc do katalogu \ Users \ nazwa użytkownika \ AppData \ Roaming \ npm \ etc. Wystarczy dodać następujący wiersz:

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

Używana ścieżka może być dowolną prawidłową ścieżką do bash.exe. Teraz, jeśli uruchomisz powyższe polecenie „npm config ls -l | grep shell”, zobaczysz następujące dane wyjściowe wskazujące, że parametr powłoki został zastąpiony:

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

Być może pewnego dnia nowa wersja npm zwróci uwagę na nadpisany parametr powłoki.

Craig Johannsen
źródło
1
Chciałbym, żeby to zadziałało. Zmieniłem zmienną środowiskową COMSPEC i wydaje się, że z tego wyciągam, ale nie mogłem sprawić, by działała poprawnie.
cchamberlain
4
Zrób to samo:$ npm config set shell "C:\\msys64\\usr\\bin\\bash"
kwarnke
Rozwiązałem swój problem zgodnie z twoją sugestią. Teraz mogę uruchamiać skrypty na npm, które zawierają więcej poleceń oddzielonych przez ;W systemie Windows, w folderze C: \ Users \ nazwa_użytkownika \ Dodałem .npmrcplik zawierającyshell = "C:\\Program Files\\Git\\bin\\bash.exe" script-shell = "C:\\Program Files\\Git\\bin\\bash.exe"
iFederx.
1

W tym celu użyj specjalnie utworzonego modułu node_module. Sugeruję użycie npm-run-all , ale istnieją inne , takie jak parallelshell .

Przykład Parallelshell znajduje się poniżej, aby zastąpić pytanie.

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

następujące polecenie:

npm run parallelexample1

działa zarówno na windows jak i unix (Linux / MacOS).

Co ciekawe, npm-run-all nie obsługuje poleceń powłoki; dlatego musimy umieścić wszystkie polecenia powłoki w oddzielnych skryptach, jak poniżej.

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

Następujące polecenie:

npm run parallelexample2

działa zarówno na windows jak i unix (Linux / MacOS).

Atilla Ozgur
źródło
dzięki za napiwek dla npm-run-all, wypróbowałem też --parallelopcję
Brandon Søren Culley
1

po prostu używając sposobu działania CMD .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/"
},
.nietoperz
start http://localhost:7777/datas/ && start http://localhost:7777/Info/
Qwerty
źródło
1

W moim przypadku wystarczyło uciec npm startz wnętrza Basha. Biegnę, cmda potem otwieram bash, biegając "c:\Program Files\Git\bin\bash.exe". Pod powłoką basha mogłem wtedy zadzwonić npm buildi npm startpomyślnie.

Być może masz już bash, jeśli używasz Git. Jeśli nie, możesz zainstalować .

Mam nadzieję, że to może zaoszczędzić komuś czas.

Mike Keskinov
źródło
Nie działa ze wszystkimi skryptami, które działają w PORT=8000
systemie
1

Możesz także użyć wieloplatformowej powłoki PowerShell https://github.com/powershell/powershell#get-powershell dla skryptów npm.

Aby ustawić dla pojedynczego projektu, uruchom to z folderu głównego projektu:

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

Aby ustawić globalnie dla wszystkich projektów węzłów:

npm config set script-shell pwsh [--global]
GorvGoyl
źródło