Як встановити оболонку для запуску сценаріїв npm у Windows


86

Я запускаю npm у Windows і хотів би використовувати і стилізувати паралельні операції в скриптах запуску, але паралельний запуск в cmd в моєму файлі package.json є якимось брудним -

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

але npm виконує скрипт під cmd.exe, який не знає про те, що ; я міг би змінити це на сценарії: { "go": "bats/bat1.bat")де bat1.bat - це файл bat cmd, який використовує команди виклику або запуску в стилі Windows для паралельного запуску команд. який працює, але дає мені сценарій, який працює лише в Windows.

Було б набагато простіше, якби я міг отримати npm для запуску сценарію під клоном bash або cygwin.

Я спробував, config: { "shell": "bash"} але все одно запускав cmd.exe

Чи є спосіб сказати npm запускати сценарії, використовуючи певну оболонку (не cmd.exe)?


Чи [все-таки] неможливо вказати оболонку в package.json? Я використовую npm як для сценаріїв windows, так і для bash і не маю можливості замінити налаштування за замовчуванням "shell" або "script-shell" для певного package.json?
Кори Алікс,

Відповіді:


164

З npm 5.1

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

або (64-бітна установка)

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

Зверніть увагу, що вам потрібно встановити git для Windows .

Ви можете повернути його, запустивши:

npm config delete script-shell

9
Це має бути прийнятою відповіддю! Працює в Windows 10 з Git Bash (включений код VS).
Alex Vang,

7
npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe"- це відповідь на всі мої проблеми з паралельними сценаріями у Windows 10 64-біт. @DuncanSungWKim 감사 합니다 за це.
TaeKwonJoe

2
Якщо я вже перебуваю в оболонці git bash і запускаю npm run <scriptз цим конфігурацією, створюється нове вікно git bash, що запускає сценарій. Це не те, що я хочу. Чи є спосіб просто викликати оболонку всередині викликаючої оболонки?
JHH

2
@JHH - У мене також відкривалися оболонки з vscode, оскільки я використовував git-bash.exe замість bash.exe. Коли я виправив так, що vscode bash був таким самим, як bash сценарію-оболонки, проблема була вирішена.
Кори Алікс,

1
Якщо ви не впевнені у шляху bash.exe, ви можете просто зробити це, npm config set script-shell bashоскільки місцезнаходження bash.exe, ймовірно, знаходитьсяPATH
Psddp

28

Ось один із способів зробити це:

  1. Створіть скрипт, такий як my_script.sh, у каталозі кошика проекту.
  2. У файлі package.json додайте рядок для запуску сценарію за допомогою bash. Наприклад:

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

Тепер ви можете запустити скрипт bash з npm за допомогою:

    npm run-script boogie

Не дуже елегантно, але це працює.

Якщо ви розробляєте і в Windows, і в Linux / Unix, то принаймні такий підхід досить портативний для обох середовищ.


3
Інший варіант: "scripts": { "start": "node ./bin/www", "bash": "bash -c", "ls": "npm run bash ls" }
камерлен

17

В ідеалі, перевизначення параметра конфігурації оболонки npm повинно працювати, але npm (принаймні версія 1.4.14), схоже, в Windows ігнорує налаштування і замість цього використовує cmd.exe.

Скористайтеся наступною командою у вашій оболонці bash або Git Bash, щоб дізнатися налаштування оболонки:

$ npm config ls -l | grep shell

За замовчуванням результат буде:

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

Однак, щоб замінити параметр оболонки за замовчуванням, ви можете додати (або відредагувати) файл npmrc до каталогу \ Users \ yourusername \ AppData \ Roaming \ npm \ etc. Просто додайте наступний рядок:

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

Шлях, який ви використовуєте, може бути будь-яким дійсним шляхом до bash.exe. Тепер, якщо ви запустите наведену вище команду "npm config ls -l | grep shell", ви побачите такий вивід, що вказує на те, що параметр оболонки був замінений:

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

Одного разу, можливо, нова версія npm зверне увагу на перевизначений параметр оболонки.


1
Бажаю, це спрацювало. Я змінив змінну середовища COMSPEC, і, здається, це тягне, але я не зміг змусити її працювати належним чином.
камерлен

4
Це виконує ту саму роботу:$ npm config set shell "C:\\msys64\\usr\\bin\\bash"
kwarnke

Я вирішив свою проблему за вашою пропозицією. Тепер я можу запускати сценарії на npm, які містять більше команд, розділених на ;Windows, у папці C: \ Users \ username \ Я додав .npmrcфайл, що міститьshell = "C:\\Program Files\\Git\\bin\\bash.exe" script-shell = "C:\\Program Files\\Git\\bin\\bash.exe"
iFederx

1

Для цього використовуйте спеціально створений node_module. Я пропоную використовувати npm-run-all , але існують і інші , наприклад, паралельна оболонка .

Нижче наведено приклад паралельної оболонки для заміни вашого питання.

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

наступна команда:

npm run parallelexample1

працює як на Windows, так і на Unix (Linux / MacOS).

Цікаво, що npm-run-all не підтримує команди оболонки; тому нам потрібно поставити всі команди оболонки в окремі сценарії, як показано нижче.

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

Наступна команда:

npm run parallelexample2

працює як на Windows, так і на Unix (Linux / MacOS).


дякую за підказку для npm-run-all, я спробував також --parallelваріант
Brandon Søren Culley

1

просто використовуючи спосіб запуску 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/"
},
.bat
start http://localhost:7777/datas/ && start http://localhost:7777/Info/

1

У моєму випадку мені просто потрібно було запустити npm startзсередини Bash. Я біжу, cmdтоді я відкриваю bash, бігаючи "c:\Program Files\Git\bin\bash.exe". Тоді під командою bash мені вдалося зателефонувати npm buildіnpm start успішно.

Можливо, у вас вже є bash, якщо ви використовуєте Git. Якщо ні, ви можете встановити його.

Сподіваюся, це може заощадити чийсь час.


Не працює з усіма сценаріями, які працюють на Linux, як, наприклад, маючиPORT=8000
shinzou

1

Ви також можете використовувати міжплатформенну PowerShell https://github.com/powershell/powershell#get-powershell для сценаріїв npm.

Щоб встановити для одного проекту, запустіть це з кореневої папки проекту:

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

Щоб встановити глобально для всіх проектів вузлів:

npm config set script-shell pwsh [--global]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.