Windows'ta npm çalıştırma betikleri için kabuk nasıl ayarlanır


86

Windows'ta npm çalıştırıyorum ve çalıştırma komut dosyalarında paralel işlemleri kullanmak & biçimlendirmek istiyorum, ancak cmd'de paralel olarak çalıştırmak package.json dosyamda biraz dağınık, yazmak istiyorum-

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

ancak npm komut dosyasını cmd.exe altında çalıştırır ve ; bunu komut dosyalarına değiştirebilirim: { "go": "bats/bat1.bat")burada bat1.bat, komutları paralel olarak çalıştırmak için windows stili çağrı veya start komutlarını kullanan bir cmd bat dosyasıdır. bu çalışıyor ancak bana yalnızca Windows'ta çalışan bir komut dosyası veriyor.

Betiği bir bash klonu veya cygwin altında çalıştırmak için npm elde edebilseydim çok daha kolay olurdu.

Denedim config: { "shell": "bash"} ama bu hala cmd.exe'yi çalıştırdı

Npm'ye komut dosyalarını belirli bir kabuk (cmd.exe değil) kullanarak çalıştırmasını söylemenin bir yolu var mı?


Package.json içinde bir kabuk belirtmek [hala] mümkün değil mi? Hem windows hem de bash komut dosyası için npm kullanıyorum ve belirli bir package.json için varsayılan "shell" veya "script-shell" ayarlarını geçersiz kılmanın bir yolu yok mu?
Corey Alix

Yanıtlar:


164

Npm 5.1'den beri

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

veya (64bit kurulum)

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

Windows için git'in kurulu olması gerektiğini unutmayın .

Aşağıdakileri çalıştırarak geri döndürebilirsiniz:

npm config delete script-shell

9
Kabul edilen cevap bu olmalı! Git Bash ile Windows 10'da çalışır (VS Code dahil).
Alex Vang

7
npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe"Windows 10 64-Bit'te paralel komut dosyalarını çalıştıran tüm sorunlarımın cevabı. @DuncanSungWKim 감사 합니다 bunun için.
TaeKwonJoe

2
Zaten bir git bash kabuğundaysam ve npm run <scriptbu yapılandırmayla çalıştırırsam, betiği çalıştıran yeni bir git bash penceresi açılır. İstediğim bu değil. Çağıran kabuk içinde basitçe kabuğu çağırmanın bir yolu var mı?
JHH

2
@JHH - Bash.exe yerine git-bash.exe kullandığım için vscode'dan açılan mermiler de vardı. Düzelttiğimde vscode bash, script-shell bash ile aynıydı, sorun çözüldü.
Corey Alix

1
Bash.exe yolu üzereyiz emin sen, sadece yapabileceği npm config set script-shell bashde muhtemelen bash.exe konuma beriPATH
Psddp

28

İşte bunu yapmanın bir yolu:

  1. Proje bin dizininizde my_script.sh gibi bir komut dosyası oluşturun.
  2. Package.json dosyanıza, betiği bash kullanarak çalıştırmak için bir satır ekleyin. Örneğin:

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

Artık bash betiğinizi npm'den şu şekilde çalıştırabilirsiniz:

    npm run-script boogie

Çok zarif değil ama işe yarıyor.

Hem Windows hem de Linux / Unix'te geliştirme yapıyorsanız, en azından bu yaklaşım her iki ortama da oldukça taşınabilir.


3
Başka bir seçenek: "scripts": { "start": "node ./bin/www", "bash": "bash -c", "ls": "npm run bash ls" }
cchamberlain

17

İdeal olarak, npm kabuk yapılandırma parametresini geçersiz kılmak işe yarar, ancak npm (en azından sürüm 1.4.14) Windows'ta ayarı yok sayıyor ve bunun yerine cmd.exe'yi kullanıyor gibi görünüyor.

Kabuk ayarını bulmak için bash veya Git Bash kabuğunuzda aşağıdaki komutu kullanın:

$ npm config ls -l | grep shell

Varsayılan olarak çıktı şu şekilde olacaktır:

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

Ancak, varsayılan kabuk parametresini geçersiz kılmak için, \ Kullanıcılar \ kullanıcı adınız \ AppData \ Roaming \ npm \ etc dizinine bir npmrc dosyası ekleyebilir (veya düzenleyebilirsiniz). Aşağıdaki satırı eklemeniz yeterlidir:

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

Kullandığınız yol, bash.exe'ye giden herhangi bir geçerli yol olabilir. Şimdi, yukarıdaki "npm config ls -l | grep shell" komutunu çalıştırırsanız, kabuk parametresinin geçersiz kılınmış olduğunu gösteren aşağıdaki çıktıyı göreceksiniz:

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

Belki bir gün, npm'nin yeni bir sürümü, geçersiz kılınan kabuk parametresine dikkat edecektir.


1
Bunun işe yaramasını diliyorum. COMSPEC ortam değişkenini değiştirdim ve bundan çekiyor gibi görünüyor, ancak düzgün çalışmasını sağlayamadım.
cchamberlain

4
Bu aynı işi yapar:$ npm config set shell "C:\\msys64\\usr\\bin\\bash"
kwarnke

Öneriniz üzerine sorunumu çözdüm. Şimdi, daha komutları ile ayrılmış ihtiva NPM komut dosyalarını çalıştırmak mümkün değilim ;klasörü C, Windows'da: \ Kullanıcılar \ kullanıcı adı \ Ben eklendi .npmrciçeren dosyayıshell = "C:\\Program Files\\Git\\bin\\bash.exe" script-shell = "C:\\Program Files\\Git\\bin\\bash.exe"
iFederx

1

Bu amaç için özel olarak oluşturulmuş bir node_module kullanın. Ben kullanmanızı öneririz hepsi npm işletilen , ancak diğerleri gibi, mevcut parallelshell .

Sorunuzun yerine geçme için paralel kapak örneği aşağıdadır.

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

aşağıdaki komutu:

npm run parallelexample1

hem windows hem de unix (Linux / MacOS) üzerinde çalışır.

İlginç bir şekilde npm-run-all, kabuk komutlarını desteklemez; bu nedenle, tüm kabuk komutlarını aşağıdaki gibi ayrı komut dosyalarına koymamız gerekir.

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

Aşağıdaki komut:

npm run parallelexample2

hem windows hem de unix (Linux / MacOS) üzerinde çalışır.


npm-run-all için bahşiş için teşekkürler, --parallelseçeneği de denedim
Brandon Søren Culley

1

sadece CMD'nin çalışma yöntemini kullanarak .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/"
},
.bat
start http://localhost:7777/datas/ && start http://localhost:7777/Info/

1

Benim durumumda npm startBash'in içinden kaçmam gerekiyordu. Ben çalıştırmak cmdçalıştırarak sonra açık bash "c:\Program Files\Git\bin\bash.exe". Bash shell altında daha sonra arayabildim npm buildve npm startbaşarılı bir şekilde.

Git kullanıyorsanız zaten bash yapmış olabilirsiniz. Değilse, kurabilirsiniz .

Umarım bu birisinin zamanını kurtarabilir.


Linux üzerinde çalışan tüm komut dosyalarıyla çalışmaz, örneğin sahip olmak gibiPORT=8000
shinzou

1

Ayrıca npm komut dosyaları için çapraz platform powershell https://github.com/powershell/powershell#get-powershell kullanabilirsiniz .

Tek proje için ayarlamak için bunu proje kök klasöründen çalıştırın:

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

Tüm düğüm projeleri için genel olarak ayarlamak için:

npm config set script-shell pwsh [--global]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.