如何在Windows中为npm运行脚本设置shell


82

我在Windows上运行npm,并希望在运行脚本中使用&样式并行操作,但是在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

有什么办法可以使用特定的外壳(不是cmd.exe)告诉npm运行脚本?


[仍然]无法在package.json中指定shell吗?我在Windows和bash脚本中都使用npm,并且无法覆盖特定package.json的默认“ shell”或“ script-shell”设置吗?
Corey Alix

Answers:


153

从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"

请注意,您需要为Windows安装git

您可以通过运行以下命令还原它:

npm config delete script-shell

8
这应该是公认的答案!在具有Git Bash的Windows 10上运行(包括VS Code)。
Alex Vang

7
npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe"是我在Windows 10 64位上运行并行脚本的所有问题的答案。@DuncanSungWKim감사합니다为此。
TaeKwonJ​​oe '18

谢谢,我在npm start时遇到问题,该问题在cmd中有效,但在bash中不起作用,并且我运行了您建议的脚本,它起作用了!!!经过两天的糊涂寻找答案。...
_-

2
如果我已经在git bash shell中并npm run <script使用此配置运行,则会生成一个新的git bash窗口来运行脚本。这不是我想要的。有没有一种方法可以在调用外壳程序内简单地调用外壳程序?
JHH

2
@JHH-我还从vscode打开了shell,因为我使用的是git-bash.exe而不是bash.exe。当我修复问题,使vscode bash与script-shell bash相同时,此问题已解决。
科里·阿利克斯

28

这是一种实现方法:

  1. 在项目bin目录中创建一个脚本,例如my_script.sh。
  2. 在package.json文件中,添加一行以使用bash运行脚本。例如:

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

现在,您可以通过以下方式从npm运行bash脚本:

    npm run-script boogie

不是很优雅,但是可以。

如果您同时在Windows和Linux / Unix上进行开发,则至少此方法对于两种环境都相当可移植。


3
另一种选择: "scripts": { "start": "node ./bin/www", "bash": "bash -c", "ls": "npm run bash ls" }
cchamberlain 2015年

16

理想情况下,覆盖npm shell config参数应该可以工作,但是Windows中的npm(至少是1.4.14版)似乎忽略了该设置,而是使用cmd.exe。

在您的bash或Git Bash shell中使用以下命令来找出shell设置:

$ npm config ls -l | grep shell

默认情况下,输出为:

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

但是,要覆盖默认的Shell参数,可以将npmrc文件添加(或编辑)到\ Users \您的用户名\ AppData \ Roaming \ npm \ etc目录。只需添加以下行:

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

您使用的路径可以是bash.exe的任何有效路径。现在,如果运行上面的“ npm config ls -l | grep shell”命令,将看到以下输出,表明shell参数已被覆盖:

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

也许有一天,新版本的npm会注意覆盖的shell参数。


1
希望这项工作成功。我更改了COMSPEC环境变量,它似乎是从中拉出来的,但是我无法使其正常工作。
cchamberlain 2015年

4
这可以完成相同的工作:$ npm config set shell "C:\\msys64\\usr\\bin\\bash"
kwarnke

我按照你的建议解决了我的问题。现在,我能够在npm上运行包含更多命令的脚本,这些命令;在Windows上的文件夹C:\ Users \ username \中已添加.npmrcshell = "C:\\Program Files\\Git\\bin\\bash.exe" script-shell = "C:\\Program Files\\Git\\bin\\bash.exe"
iFederx

2

只是使用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/

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不支持shell命令。因此,我们需要将所有shell命令放在单独的脚本中,如下所示。

"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选项
BrandonSørenCulley

1

就我而言,我只需npm start要从Bash内部运行。我跑步,cmd然后通过运行打开bash "c:\Program Files\Git\bin\bash.exe"。在bash shell中我则是能够调用npm buildnpm start成功地。

如果您正在使用Git,则可能已经有bash了。如果没有,您可以安装它。

希望这可以节省别人的时间。


不适用于在Linux上运行的所有脚本,例如,PORT=8000
shinzou

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.