顺序运行NPM脚本


148

假设我有

"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来探索其功能。谢谢你的帮助!


底部的最新答案
Tzach Ovadia

根据Start命令的文档,您应该能够使用/wait参数(启动应用程序并等待其终止)
Tzach Ovadia

Answers:


316

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

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

说明:

  • 使用&&(双“&”号)顺序执行。
  • 使用&(单个“&”号)进行并行执行。

4
这是最好的方法,因为它按顺序执行,因为每个命令都必须按照OP中的要求在previos完成后才执行。谢谢
赖斯

19
&&由外壳评估,并且在Windows上不起作用。
BernhardDöbler18年

11
这不应是公认的答案。根据@BernhardDöbler,&&语法是UNIX构造。它在Window的计算机上的行为将不正确,可能会对您的构建过程造成破坏性后果。
拉菲·戈德堡

3
@RafeGoldberg &&运算符在Windows和* nix环境中具有相同的执行行为,即顺序执行。除非有我们都缺少的东西?
赖斯

3
@米oy vey; 我很笨,把我的单和双“&”号操作符混在一起了。根据npm-run-all文档:“我们有时用来&并行运行多个命令,但是Windows' cmd.exe...不支持[this运算符]。” 因此,看来您是对的-至少从我的简要研究来看,该&&操作员似乎完全跨平台兼容。
拉菲·戈德堡

31

遵循@Mobiletainment的出色答案之后,您还可以使用npm-run-all使命令更短,更易读。在您的情况下:

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

run-snpm-run-all提供的快捷方式,可按顺序运行所有给定的npm-scripts,因此-srun-s是的缩写npm-run-all -s)。


19

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


2
我会要求他们彼此等待完成,它们会顺序触发,但不会等待。
莱斯

2
我认为这不是节点/ npm问题。从start技术上讲,您正在Windows中执行的命令完成。使用/wait标志和start强制start应用程序保持打开状态,直到内部方法也完成为止。
dvlsg

要进行测试,请start notepad从命令提示符处运行,然后查看原始命令提示符。您应该能够键入另一个命令。然后运行start /wait notepadstart打开记事本窗口时,命令应继续“运行”(再次查看命令提示符)。然后,一旦关闭记事本,start便会完成。
dvlsg

\ wait解决方案不适用于通过双“&”号附加的命令或固定npm前/后命令。
赖斯

15

您可以为脚本pre加上前缀,post这样它们将自动执行:

"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


如问题所示,这是行不通的:“当我使用前/后修复时,它们会顺序启动,但它们不等待父脚本完成才执行。”
罗素·奇索姆


2

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

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

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

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

$ npm-run-all clean lint build

有关如何并行运行多个npm命令的信息,请参见此问题。


1
这是要走的路。npm-run-all是最好的。并将生成一个跨平台的package.json。
罗伯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.