Как установить оболочку для npm run-скриптов в Windows

86

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

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

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

Было бы намного проще, если бы я мог заставить npm запускать скрипт под клоном bash или cygwin.

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

Есть ли способ указать npm запускать скрипты с использованием определенной оболочки (не cmd.exe)?

user2129444
источник
[Все еще] невозможно указать оболочку в package.json? Я использую npm как для Windows, так и для сценариев bash, и у меня нет возможности переопределить настройки "оболочки" или "оболочки сценария" по умолчанию для конкретного package.json?
Кори Аликс

Ответы:

163

Начиная с 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 Code).
Alex Vang
7
npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe"это ответ на все мои проблемы с запуском параллельных скриптов в 64-битной Windows 10. @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, в каталоге bin вашего проекта.
  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" }
cchamberlain
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, и, похоже, она исходит из этого, но мне не удалось заставить ее работать правильно.
cchamberlain
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 , но есть и другие , например, параллельная оболочка .

Ниже приведен пример Parallelshell для замены по вашему вопросу.

"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вариант
Брэндон Сёрен Калли
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/"
},
.летучая мышь
start http://localhost:7777/datas/ && start http://localhost:7777/Info/
Qwerty
источник
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]
ГорвГойл
источник