按顺序运行 NPM 脚本

IT技术 javascript node.js npm cmd
2021-03-14 22:43:11

假设我有

"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 命令来让所有这些脚本依次启动。当我使用前/后修复时,它们会按顺序启动,但在执行之前不会等待父脚本完成。我假设唯一的解决方案是:在 async.series 辅助函数中触发 shell 命令时,如何让 Gulp 任务按顺序触发?? 我知道这可以用 Gulp 来完成,但我现在想坚持使用 NPM 来探索它的功能。谢谢你的帮助!

6个回答

通过 npm run 调用这些脚本并使用双 & 将它们链接起来&&

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

解释:

  • 使用&&(双与号)进行顺序执行。
  • 使用&(单与号)进行并行执行。
@Rice oy vey; 是愚蠢的,混淆了我的单和双与号运算符。根据npm-run-all文档:“我们有时使用&并行运行多个命令,但 Windows ' cmd.exe......不支持 [此运算符]。” 所以看起来你是对的——至少从我的简短研究来看,&&运营商似乎完全兼容跨平台。
2021-04-15 22:43:11
这不应该是公认的答案。根据@BernhardDöbler,&&语法是 UNIX 构造。它会在 Window 的机器上运行不正确,可能会对您的构建过程造成破坏性后果。
2021-04-26 22:43:11
这效果最好,因为它按顺序执行,因为每个命令都不会按照 OP 中的要求执行,直到 previos 完成。谢谢
2021-05-04 22:43:11
@RafeGoldberg && 运算符在 windows 和 *nix 环境中具有相同的执行行为,即顺序执行..除非我们都遗漏了什么?
2021-05-05 22:43:11
&& 由 shell 评估,不适用于 Windows。
2021-05-14 22:43:11

遵循@Mobiletainment 的精彩回答,您还可以使用npm-run-all使命令更短且更具可读性。在你的情况下:

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

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

虽然乍一看这似乎是一个优雅的解决方案,但查看 的依赖关系树会npm-run-all发现它有 69 个依赖关系(不包括开发人员!),例如npm.broofa.com/?q=npm-run-all不,谢谢,我不想成为某种侧载攻击或类似left-pad问题的闹剧的受害者
2021-05-09 22:43:11

您可以为脚本添加前缀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

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

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

\wait 解决方案不适用于通过双与号或 pre/post 固定 npm 命令附加的命令。
2021-04-19 22:43:11
要对此进行测试——start notepad从命令提示符运行,然后查看原始命令提示符。您应该能够输入另一个命令。然后运行start /wait notepadstart当您的记事本窗口打开时,命令应继续“运行”(再次查看命令提示符)。然后一旦你关闭记事本,start就完成了。
2021-05-05 22:43:11
我会要求他们等待对方完成,这些将按顺序触发但不会等待。
2021-05-10 22:43:11
我不认为这是节点/ npm 问题。start您在 Windows 中执行命令在技术上完成。使用/wait标志 withstart强制start应用程序保持打开状态,直到内部方法也完成。
2021-05-12 22:43:11

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

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

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

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

$ npm-run-all clean lint build

请参阅此问题以了解如何并行运行多个 npm 命令

这是要走的路。npm-run-all 是最好的。并将生成一个跨平台的 package.json。
2021-05-07 22:43:11