ChatGPT解决这个技术问题 Extra ChatGPT

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

我在 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

有没有办法告诉 npm 使用特定的 shell(不是 cmd.exe)运行脚本?

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

C
Community

从 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 for windows installed

您可以通过运行恢复它:

npm config delete script-shell

这应该是公认的答案!使用 Git Bash(包括 VS 代码)在 Windows 10 上工作。
npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe" 是我在 Windows 10 64 位上运行并行脚本的所有问题的答案。 @DuncanSungWKim 감사합니다 为此。
如果我已经在 git bash shell 中并使用此配置运行 npm run <script,则会生成一个运行脚本的新 git bash 窗口。这不是我想要的。有没有办法在调用外壳中简单地调用外壳?
@JHH - 我也从 vscode 打开了 shell,因为我使用的是 git-bash.exe 而不是 bash.exe。当我修复 vscode bash 与 script-shell bash 相同时,问题就解决了。
如果您不确定 bash.exe 路径,您可以执行 npm config set script-shell bash,因为 bash.exe 位置可能在 PATH
C
Craig Johannsen

这是一种方法:

在您的项目 bin 目录中创建一个脚本,例如 my_script.sh。在您的 package.json 文件中,添加一行以使用 bash 运行脚本。例如:“脚本”:{“boogie”:“bash bin/my_script.sh”}

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

    npm run-script boogie

不是很优雅,但它有效。

如果您同时在 Windows 和 Linux/Unix 中进行开发,那么至少这种方法对于这两种环境都是相当可移植的。


另一种选择:"scripts": { "start": "node ./bin/www", "bash": "bash -c", "ls": "npm run bash ls" }
C
Craig Johannsen

理想情况下,覆盖 npm shell 配置参数应该可以工作,但 npm(至少版本 1.4.14)在 Windows 中似乎会忽略该设置并改用 cmd.exe。

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

$ npm config ls -l | grep shell

默认情况下,输出将是:

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

但是,要覆盖默认的 shell 参数,您可以将 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参数已经被覆盖:

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

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


希望这行得通。我更改了 COMSPEC 环境变量,它似乎是从中提取的,但我无法让它正常工作。
这做同样的工作:$ npm config set shell "C:\\msys64\\usr\\bin\\bash"
我按照您的建议解决了我的问题。现在,我可以在 npm 上运行包含由 ; 分隔的更多命令的脚本 在 Windows 上,在文件夹 C:\Users\username\ 我添加了一个包含 shell = "C:\\Program Files\\Git\\bin\\bash.exe" script-shell = "C:\\Program Files\\Git\\bin\\bash.exe".npmrc 文件
G
GorvGoyl

您还可以将跨平台的 powershell https://github.com/powershell/powershell#get-powershell 用于 npm 脚本。

要为单个项目设置,请从项目根文件夹运行:

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

为所有节点项目全局设置:

npm config set script-shell pwsh [--global]

我喜欢这个解决方案!在 Azure DevOps Pipelines 上运行良好。
A
Atilla Ozgur

为此目的使用专门创建的 node_module。我建议使用 npm-run-all,但存在 others,例如 parallelshell

下面是 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 选项
Q
Qwerty

只是使用CMD的方式运行.bat!

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

M
Mike Keskinov

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

如果您正在使用 Git,您可能已经拥有 bash。如果没有,您可以install它。

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


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