ChatGPT解决这个技术问题 Extra ChatGPT

顺序运行 NPM 脚本

假设我有

"scripts": {
    "pre-build": "echo \"Welcome\" && exit 1",
    "build_logic": "start cmd.exe @cmd /k \"yo esri-appbuilder-js:widget && exit 1\"",
    "post_build":  "start C:\\WebAppBuilderForArcGIS\\startupShortcut",
    "exit" : "start cmd.exe @cmd /k \"echo \"goodbye\" && exit 1\""
  },

我可以运行什么 NPM 命令来让所有这些脚本按顺序启动。当我使用前/后修复时,它们会按顺序启动,但不会等待父脚本完成后再执行。我假设唯一的解决方案是: How do I get Gulp tasks to fire sequentially when firing shell commands in an async.series helper function? ?我知道这可以通过 Gulp 完成,但我现在想坚持使用 NPM 来探索它的功能。谢谢你的帮助!

更新了底部的答案
根据 Start 命令的文档,您应该可以使用 /wait 参数(启动应用程序并等待它终止)

M
Mobiletainment

通过 npm run 调用这些脚本并用双 & 符号 && 链接它们:

npm run pre-build && npm run build_logic && npm run post_build && npm run exit

解释:

使用 &&(双 & 号)进行顺序执行。

使用 &(单与号)进行并行执行。


这效果最好,因为它按顺序执行,因为每个命令在 previos 完成之前不会执行,如 OP 中所要求的。谢谢
&& 由 shell 评估,不适用于 Windows。
这不应该是公认的答案。根据@BernhardDöbler,&& 语法是一种 UNIX 结构。它将在 Window 的机器上运行不正确,可能会对您的构建过程造成破坏性后果。
@RafeGoldberg && 运算符在 windows 和 *nix 环境中具有相同的执行行为,即顺序执行..除非我们都缺少某些东西?
@Rice 哎呀;很愚蠢,混淆了我的单和双&符号运算符。根据 npm-run-all 文档:“我们有时使用 & 来并行运行多个命令,但 Windows 的 cmd.exe...不支持 [this operator]。”所以看起来你是对的——至少从我的简短研究来看,&& 运算符似乎完全兼容跨平台。
O
Or A.

继 @Mobiletainment 的出色 answer 之后,您还可以使用 npm-run-all 使命令更短且更具可读性。在你的情况下:

"scripts": {
    ...
    "build": "run-s pre-build build_logic post_build exit"
}

run-snpm-run-all 提供的快捷方式,它按顺序运行所有给定的 npm 脚本,因此是 -srun-snpm-run-all -s 的较短版本)。


虽然这乍一看似乎是一个优雅的解决方案,但检查 npm-run-all 的依赖关系树会发现它有 69 个依赖关系(不包括开发部门!),例如 npm.broofa.com/?q=npm-run-all 。不,谢谢,我不想成为某种侧载攻击或类似 left-pad 问题的闹剧的受害者。
我看对了吗,run-s 真的只是替换了 npm run pre-build && npm run build_logic && npm run post_build && npm run exit?为什么我要引入另一个让每个知道 && 命令的开发人员感到困惑的依赖项?就我而言,我正在开发使用 run-s(由另一个开发人员介绍)的项目,它让我感到困惑而不是帮助我!我可以安全地删除 run-s 还是我在这里遗漏了什么?
我认为,如果你有很多脚本要运行,并且使用 Package.json 作为任务运行器(如 GruntGulp),那么 npm -run-all 可能是一个有效的工具。但是,如果您只想运行两个脚本,例如 buildclean(例如),那么我更喜欢使用 && 语法。
T
Tzach Ovadia

您可以为脚本 prepost 添加前缀,以便它们自动执行:

"scripts": {
  "prebuild": "echo \"Welcome\" && exit 1",
  "build": "start cmd.exe @cmd /k \"yo esri-appbuilder-js:widget && exit 1\"",
  "postbuild":  "start C:\\WebAppBuilderForArcGIS\\startupShortcut",
  "exit" : "start cmd.exe @cmd /k \"echo \"goodbye\" && exit 1\""
}

然后运行 npm run build


这不起作用,如问题所示:“当我使用前/后修复时,它们会按顺序启动,但不会等待父脚本完成后再执行。”
D
Dave V

您可以将它们串入另一个脚本。 "start": "pre-build && build_logic && post_build && exit"


我会要求他们互相等待完成,这些会依次触发但不会等待。
我不认为这是一个节点/npm 问题。您在 Windows 中执行的 start 命令在技术上完成。使用带有 start/wait 标志来强制 start 应用程序保持打开状态,直到内部方法也完成。
要对此进行测试——从命令提示符运行 start notepad,然后查看原始命令提示符。您应该能够输入另一个命令。然后运行 start /wait notepadstart 命令应在您的记事本窗口打开时继续“运行”(再次查看命令提示符)。然后,一旦您关闭记事本,start 就会完成。
\wait 解决方案不适用于通过双 & 号或前/后固定 npm 命令附加的命令。
K
KyleMit

您可以使用 npm-run-all 以多种不同方式组合多个命令

例如,如果您的 package.json 中有以下脚本:

"scripts": {
    "clean": "rimraf dist",
    "lint":  "eslint src",
    "build": "babel src -o lib"
}

您可以像这样按顺序运行它们:

$ npm-run-all clean lint build

请参阅 how to run multiple npm commands in parallel 的此问题


这是要走的路。 npm-run-all 是最好的。并将生成一个跨平台的 package.json。
M
Muhammed Moussa

你可以试试:


"scripts": {
  "clean-dist": "rm -f ./dist/*.js && rm -f ./dist/*.map",
  "build": "npm run clean-dist && parcel build ./packages/index.html"
},

A
Aerodynamic

顺序和并行混合示例

如果您需要混合使用,这是我为确保 command_1 首先运行和完成而做的,而 command_2a 和 command_2b 可以并行运行。

    "dev": "yarn command_1 && (yarn command_2a & yarn command_2b)"

实际例子:

    "dev": "yarn buildPackage && (yarn watchPackageSource & yarn watchExamplePage)"

特定于操作系统,不适用于 Windows
这不一定是正确的,取决于您的 Windows 版本和您使用的外壳。检查这里的评论(也许最好使用 unix shell):stackoverflow.com/a/39172660/5037146
npm 的重点是跨外壳/平台。否则你应该坚持使用 .sh、.bat、.makefile、cmake、sln、... - 同时是一个 npm 选项。 && 是跨平台的(即使在 powershell 中似乎也可以工作,即使直接运行失败)。 & 不是