万一失败,如何继续运行 package.json 中定义的脚本?

Posted

技术标签:

【中文标题】万一失败,如何继续运行 package.json 中定义的脚本?【英文标题】:How to continue running scripts defined in package.json in case one fails? 【发布时间】:2020-10-02 05:47:05 【问题描述】:

我在 package.json 文件中有这个:


 "name": "test demo",
 "version": "1.0.0",
 "description": "test demo scripts",
 "scripts": 
   "test:v1": "wdio src/resources/config/wdio.chrome.conf.js --spec test/Tests.spec.ts",
   "test:v2": "wdio src/resources/config/wdio.firefox.conf.js --spec test/Tests.spec.ts",

   "test": "npm run test:v1 && npm run test:v2"
   ,

    ...

运行此命令时:

npm run test

那么如果test:v1 失败,那么test:v2 脚本根本不会执行。 有没有办法配置它,以便所有脚本都运行,而不管其中一些脚本是否失败?

编辑: 当我在 package.json 中尝试这个时:

"test": "npm run test:v1 ; npm run test:v2"

然后我仍然没有执行两个脚本,只是 test:v1 执行错误。 这是我在控制台中得到的:

C:\2020\demo>npm run test

> demo@1.0.0 test C:\2020\demo
> npm run test:v1 ; npm run test:v2

> demo@1.0.0 test:v1 C:\2020\demo
> wdio src/resources/config/wdio.chrome.conf.js --spec test/Tests.spec.ts ";" 
  "npm" "run" "test:v2"

Execution of 1 spec files started at 2020-06-12T15:16:42.936Z

[0-0] RUNNING in chrome - C:\2020\demo\Tests.spec.ts

... other log with failing tests ...

Spec Files:      0 passed, 1 failed, 1 total (100% completed) in 00:00:27

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! demo@1.0.0 test:v1: `wdio src/resources/config/wdio.chrome.conf.js --spec test/Tests.spec.ts ";" "npm" "run" "test:v2"`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the demo@1.0.0 test:v1 script.
npm ERR! This is probably not a problem with npm. There is likely additional 
logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\<User>\AppData\Roaming\npm-cache\_logs\2020-06- 
12T15_17_10_512Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! demo@1.0.0 test: `npm run test:v1 ; npm run test:v2`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the demo@1.0.0 test script.
npm ERR! This is probably not a problem with npm. There is likely additional 
logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\<User>\AppData\Roaming\npm-cache\_logs\2020-06- 
12T15_17_10_548Z-debug.log

如果我在 package.json 中这样尝试:

"test": "npm run test:v1; npm run test:v2"

然后我在控制台中得到这个:

npm ERR! missing script: test:v1;
npm ERR!
npm ERR! Did you mean one of these?
npm ERR!     test:v1
npm ERR!     test:v2

谢谢!

【问题讨论】:

如果你运行npm config get script-shell 它会报告哪个shell?它是否报告:1) sh - 这是 npm 用于在 *nix 平台上运行 npm 脚本的默认 shell。 2) 或者它是否报告cmd.exe - 这是 npm 用于在 Windows 平台上运行 npm 脚本的默认 shell。如果是后者,即 cmd.exe,则更改您的 test 脚本以使用单个 & 符号,例如:"test": "npm run test:v1 &amp; npm run test:v2" @RobC 感谢您的评论!这就是我得到的:C:\Program Files\nodejs&gt;npm config get script-shell null C:\Program Files\nodejs&gt;npm config get shell C:\WINDOWS\system32\cmd.exe 是的,所以您使用的是 Windows,npm 脚本使用的默认 shell 是 cmd.exe - 这就是为什么当您尝试使用分号 (;) 时 - 根据 @ gzcz 回答它不起作用。分号 (;) 将满足您在 *nix 平台(Linux、macOS 等)上的要求,因为 npm 使用 sh 作为 npm 脚本的外壳。根据我的第一条评论,您需要尝试使用single ampersand (&amp;)。例如:"test": "npm run test:v1 &amp; npm run test:v2" @RobC 非常感谢!它有帮助。它适用于&amp;。您能否添加评论作为答案,以便我接受:) 【参考方案1】:

解决方案因您使用的操作系统而异,因为 NPM 使用不同的 shell 来运行 npm 脚本。

*nix(Linux、macOS 等)上,npm 用于运行 npm 脚本的默认 shell 是 sh。 在 Windows 上,npm 用于运行 npm 脚本的默认 shell 是 cmd.exe

检查 npm 使用的是哪个 shell?

使用npm config 命令,您需要检查script-shell 设置的值。为此,您可以运行以下命令:

npm config get script-shell

它通常会返回/打印cmd.exesh 的路径名 - 取决于您使用的操作系统。


解决方案:

    如果您运行的是 Windows 并且默认 shell 是 cmd.exe

    然后将 package.json 中的 test 脚本更改为以下内容:

    "test": "npm run test:v1 & npm run test:v2"
    

    请注意,双 & 符号 (&amp;&amp;) 已替换为单 & 符号 (&amp;)。

或者……

    如果您正在运行 *nix 并且默认 shell 是 sh

    然后将 package.json 中的 test 脚本更改为以下内容:

    "test": "npm run test:v1; npm run test:v2"
    

    请注意,双与号 (&amp;&amp;) 已替换为单个分号 (;)。

【讨论】:

【参考方案2】:
npm run test:v1; npm run test:v2

; 表示不管上一个命令是否成功,都运行下一个命令。

&amp;&amp; 表示只有前一个命令成功时才运行下一个命令。

【讨论】:

感谢您的回复!我根据您的评论用我尝试过的内容编辑了我的问题。不幸的是,它没有用。只执行了第一个脚本,失败后另一个脚本没有启动。 您可以使用concurrently。运行npm install concurrently 进行安装,然后在您的 package.json 脚本中执行"test": "concurrently \"npm run test:v1\" \"npm run test:v2\""。这基本上会同时运行两个测试命令。

以上是关于万一失败,如何继续运行 package.json 中定义的脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 package.json 运行 ts 脚本?

包含 package.json 文件失败时使用 webpack

vue脚手架项目启动失败找不到package.json文件

如何在 package.json 脚本中运行多个命令?

npm 错误!尝试安装 package.json 时 git dep 准备失败

mergeReleaseResources 失败,原因是“资源名称无效”(来自 package.json 的版本)