假设我有
"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
参数(启动应用程序并等待它终止)
通过 npm run 调用这些脚本并用双 & 符号 &&
链接它们:
npm run pre-build && npm run build_logic && npm run post_build && npm run exit
解释:
使用 &&(双 & 号)进行顺序执行。
使用 &(单与号)进行并行执行。
继 @Mobiletainment 的出色 answer 之后,您还可以使用 npm-run-all 使命令更短且更具可读性。在你的情况下:
"scripts": {
...
"build": "run-s pre-build build_logic post_build exit"
}
run-s
是 npm-run-all
提供的快捷方式,它按顺序运行所有给定的 npm 脚本,因此是 -s
(run-s
是 npm-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 还是我在这里遗漏了什么?
build
和 clean
(例如),那么我更喜欢使用 &&
语法。
您可以为脚本 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
您可以将它们串入另一个脚本。 "start": "pre-build && build_logic && post_build && exit"
start
命令在技术上已完成。使用带有 start
的 /wait
标志来强制 start
应用程序保持打开状态,直到内部方法也完成。
start notepad
,然后查看原始命令提示符。您应该能够输入另一个命令。然后运行 start /wait notepad
。 start
命令应在您的记事本窗口打开时继续“运行”(再次查看命令提示符)。然后,一旦您关闭记事本,start
就会完成。
您可以使用 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 的此问题
你可以试试:
"scripts": {
"clean-dist": "rm -f ./dist/*.js && rm -f ./dist/*.map",
"build": "npm run clean-dist && parcel build ./packages/index.html"
},
顺序和并行混合示例
如果您需要混合使用,这是我为确保 command_1 首先运行和完成而做的,而 command_2a 和 command_2b 可以并行运行。
"dev": "yarn command_1 && (yarn command_2a & yarn command_2b)"
实际例子:
"dev": "yarn buildPackage && (yarn watchPackageSource & yarn watchExamplePage)"
&&
由 shell 评估,不适用于 Windows。&&
语法是一种 UNIX 结构。它将在 Window 的机器上运行不正确,可能会对您的构建过程造成破坏性后果。npm-run-all
文档:“我们有时使用&
来并行运行多个命令,但 Windows 的cmd.exe
...不支持 [this operator]。”所以看起来你是对的——至少从我的简短研究来看,&&
运算符似乎完全兼容跨平台。