按顺序运行NPM脚本

Ric*_*ice 115 javascript cmd node.js 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\""
  },
Run Code Online (Sandbox Code Playgroud)

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

Mob*_*ent 244

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

npm run pre-build && npm run build_logic && npm run post_build && npm run exit
Run Code Online (Sandbox Code Playgroud)

说明:

  • 使用&&(双&符号)进行顺序执行.
  • 使用&(单个&符号)进行并行执行.

  • `&&`由shell评估,不适用于Windows. (10认同)
  • 这不应该是公认的答案.Per @BernhardDöbler,`&&`语法是UNIX构造.它在Window的机器上表现不正确,可能会对您的构建过程造成严重后果. (9认同)
  • @Rice oy vey; 是愚蠢的,混淆了我的单和双符号运算符。根据 `npm-run-all` 文档:“我们有时使用 `&` 来并行运行多个命令,但 Windows 的 `cmd.exe`... 不支持 [此运算符]。” 所以看起来你是对的——至少从我的简短研究来看,`&&` 运算符似乎完全兼容跨平台。 (8认同)
  • @RafeGoldberg && 运算符在 windows 和 *nix 环境中具有相同的执行行为,即顺序执行..除非我们都遗漏了什么? (7认同)
  • 这是最好的,因为它按顺序执行,因为每个命令都不会执行,直到previos完成,如OP中所要求的那样.谢谢 (4认同)
  • 在 Windows 10 上,“&&”对我有用。我有一个幽灵博客,我的下一个 js 应用程序将连接到它。因此,我在 `package.json` 文件中使用此命令来按顺序运行博客和下一个 js: `"scripts": { "all": "cd my-blog-folder && Ghost start && cd.. &&下一个开发人员”,... }`。然后我运行这个命令来执行:`npm run-script all` (4认同)
  • && 在 Windows shell 上对我有用。然而单身&没有。并发或内联节点脚本是并行运行命令的正确方法。 (2认同)

Or *_* A. 20

关注@Mobiletainment的最佳答案,您还可以使用npm-run-all使命令更短,更易读.在你的情况下:

"scripts": {
    ...
    "build": "run-s pre-build build_logic post_build exit"
}
Run Code Online (Sandbox Code Playgroud)

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

  • 虽然这乍一看似乎是一个优雅的解决方案,但检查“npm-run-all”的依赖关系树发现它有 69 个依赖关系(不包括开发部门!),请参见 https://npm.broofa.com/? q=npm-run-all 。不,谢谢,我不想成为某种侧载攻击或像“left-pad”问题这样的闹剧的受害者。 (18认同)

Dav*_*e V 19

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

  • 我会要求他们彼此等待完成,它们会顺序触发,但不会等待。 (2认同)
  • 我不认为这是一个node/npm问题.您在Windows中执行的`start`命令在技术上*已完成.使用带有`start`的`/ wait`标志强制`start`应用程序保持打开状态,直到内部方法也完成. (2认同)

Tza*_*dia 11

您可以为脚本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\""
}
Run Code Online (Sandbox Code Playgroud)

然后跑 npm run build

  • 这不起作用,如问题所示:“当我使用前/后修复时,它们会按顺序启动,但在执行之前不会等待父脚本完成。” (2认同)

Kyl*_*Mit 6

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

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

"scripts": {
    "clean": "rimraf dist",
    "lint":  "eslint src",
    "build": "babel src -o lib"
}
Run Code Online (Sandbox Code Playgroud)

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

"scripts": {
    "clean": "rimraf dist",
    "lint":  "eslint src",
    "build": "babel src -o lib"
}
Run Code Online (Sandbox Code Playgroud)

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


Muh*_*ssa 5

你可以试试:


"scripts": {
  "clean-dist": "rm -f ./dist/*.js && rm -f ./dist/*.map",
  "build": "npm run clean-dist && parcel build ./packages/index.html"
},
Run Code Online (Sandbox Code Playgroud)


Bri*_*rks 5

有几个选项比接受的答案更好:

  • &&- 顺序运行命令,只要每个命令都成功:command && command && command大多数shell都支持(早期版本的 Powershell 不支持此功能)(感谢@Mobiletainment)
  • ;- 按顺序运行命令,忽略成功/失败;大多数(如果不是全部)shell 都支持
  • npm-run-all- 可以顺序或并行运行多个命令;请参阅使用文档(感谢@Or A.)
  • concurrently- 并行运行多个命令(包含在内,因为这是一个流行的 Google 结果);使用说明请参阅文档