NodeJS 按顺序运行NPM脚本

xqnpmsa8  于 2023-03-01  发布在  Node.js
关注(0)|答案(9)|浏览(213)

假设我有

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

vawmfj5a

vawmfj5a1#

通过npm run调用这些脚本,并使用两个与号**&&**将它们链接起来:

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

说明:

  • 使用**&&**(双与号)进行顺序执行。
  • 使用**&**(单个与号)进行并行执行。
1yjd4xko

1yjd4xko2#

在@ Mobilecartainment强大的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的较短版本)。

nszi6y05

nszi6y053#

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

g9icjywg

g9icjywg4#

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

yeotifhr

yeotifhr5#

可以使用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的此问题

yyhrrdl8

yyhrrdl86#

您可以尝试:

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

vom3gejh7#

有几个选项比公认的答案更好:

  • &&-按顺序运行命令,只要每个命令都成功:command && command && command;在 * 大多数 * shell中支持(早期版本的Powershell不支持此功能)(感谢@Mobiletainment)
  • ;-按顺序运行命令,忽略成功/失败;在大多数(如果不是全部) shell 中得到支持
  • npm-run-all软件包-可按顺序或并行运行多个命令;有关用法,请参阅the documentation(感谢@Or A.)
  • concurrently包-并行运行多个命令(包括在内,因为这是一个流行的谷歌结果);有关用法,请参阅文档
az31mfrm

az31mfrm8#

顺序和并行混合示例

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

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

示例:

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

iqxoj9l99#

对于所有在2023年读到这个问题的人,现在,Windows WSL允许您运行Linux命令串联样式'&',而无需安装额外的依赖项。
我们可以从PowerShell/cmd绕过WSL命令,如下所示
wsl npm run build & npm start
这将略微取决于您要运行的指令类型,例如.bat、.sh...

相关问题