Windows 上 npm run 脚本中 shell 脚本的退出状态

Tob*_*bbe 5 windows bash node.js npm

我有一个非常简单的 shell 脚本,test.sh

#!/usr/bin/env bash

exit 1
Run Code Online (Sandbox Code Playgroud)

我从我的test运行脚本中调用它package.json

"scripts": {
  "test": "test.sh && echo \"unexpected output\""
},
Run Code Online (Sandbox Code Playgroud)

运行npm test我得到这个:

$ npm test

> testtest@1.0.0 test C:\Users\[path]\testtest
> test.sh && echo "unexpected output"

"unexpected output"
Run Code Online (Sandbox Code Playgroud)

看起来 npm 并不关心 test.sh 的非零退出代码。我没想到会看到“意外的输出”。

"test"当命令执行的步骤之一(test.sh在本例中)因错误退出时,如何使命令的执行停止?

在我的 package.json 中:"test": "test.sh && echo $?",
这是输出:

$ npm test

> testtest@1.0.0 test C:\Users\[path]\testtest
> test.sh && echo $?

$?
Run Code Online (Sandbox Code Playgroud)

有了这个:"test": "test.sh && echo \"$?\"",
我得到这个:

$ npm test

> testtest@1.0.0 test C:\Users\[path]\testtest
> test.sh && echo "$?"

"$?"
Run Code Online (Sandbox Code Playgroud)

作为健全性检查,我在退出后添加了一个回显test.sh。幸好它没有打印:)

#!/usr/bin/env bash

exit 1

echo "This should not print"
Run Code Online (Sandbox Code Playgroud)

“这不应该打印”文本永远不会出现在我的控制台中。

实际上,添加echobeforeexit 1也不会在我的 GitBash 控制台上打印任何内容。相反,它会打印到 npm 启动的临时 cmd 窗口。所以我猜测退出状态在该 cmd 会话中丢失了。

mh8*_*020 3

这对我有用:

"scripts": {
  "test": "bash test.sh && echo \"unexpected output\""
},
Run Code Online (Sandbox Code Playgroud)

通过附加的“bash”,脚本在当前的 Git Bash 中运行。不打印“意外输出”。如果我省略“bash”,则会打开一个新的 Bash 窗口,并且我还会得到“意外的输出”。

$ npm test

> npm2@1.0.0 test D:\Martin\dev\npm-test\npm2
> bash test.sh && echo "unexpected output"

Hi from script! Next: exit 1
npm ERR! Test failed.  See above for more details.
Run Code Online (Sandbox Code Playgroud)

附带说明一下,如果您正在开发跨平台 Node.js 项目,最好避免使用 Bash/Cmd/Powershell 脚本。只需使用 Node.js 脚本即可,无需安装其他工具。