简答:
基本上,您想要的是有一个类似这样的 npm 脚本,其中 <arg-here> 是通过 CLI 提供的;
...
"scripts": {
"my-build": "npm run vumper <arg-here> && npm run format",
...
},
...
但是,不幸的是,npm 没有内置功能来实现这一点。
特殊的 npm 选项 --,(有关此选项的更多信息,请参阅下面解决方案 1 的末尾),只能用于将参数传递给 END 的脚本,但不进入中间。因此,如果您的两个命令的顺序相反,则可以像这样使用 -- 选项:
...
"scripts": {
"my-build": "npm run format && npm run vumper --",
...
},
...
要克服没有内置功能将参数传递到脚本的 MIDDLE 的限制,请考虑以下解决方案:
-
对于仅 Bash 的解决方案,请参阅 “解决方案 1” 部分。
-
如果需要跨平台支持,请遵循“解决方案 2” 部分中描述的解决方案。
解决方案 1 - Bash(MacOS/Linux/ 等):
在 package.json 的 scripts 部分中配置您的 my-build 脚本以调用 Bash shell function,如下所示:
package.json
...
"scripts": {
"my-build": "func() { npm run vumper \"$1\" && npm run format; }; func",
"vumper": "node node_modules/vumper/index.js",
"format": "prettier --single-quote -width=80 --write package.json"
},
...
说明:
名为 func 的 Bash 函数执行以下操作:
- 首先运行
npm run vumper <arg>。其中<arg> 将是通过 CLI 传递的 shell 参数。它在脚本中使用$1 引用(即第一个positional parameter/argument)。
- 随后它通过命令
npm run format 运行名为format 的脚本。
这两个npm run 命令使用&& 运算符链接,因此第二个npm run format 命令只有在初始npm run vumper <arg> 命令成功完成时才会运行(即返回0 退出代码)。
正在运行my-build 脚本:
要通过 CLI 调用 my-build,您需要运行:
npm run my-build -- dv
注意:
-
在这种情况下,结尾的 dv 部分是将传递给您的 vumper 脚本的参数。
-
必须在参数之前指定特殊选项--。 docs 将 -- 选项描述为:
...getopt 使用特殊选项-- 来分隔选项的结尾。 npm 会将-- 之后的所有参数直接传递给你的脚本:...参数只会传递给npm run 之后指定的脚本,而不是任何前置或后置脚本。
解决方案 2 - 跨平台:
对于跨平台解决方案(与 Bash、Windows 命令提示符/cmd.exe 和 PowerShell 等一起成功运行的解决方案),您需要使用 nodejs 帮助脚本,如下所示。
run.js
让我们将nodejs脚本命名为run.js并将其保存在项目根目录中,与package.json处于同一级别。
const execSync = require('child_process').execSync;
const arg = process.argv[2] || 'dv'; // Default value `dv` if no args provided via CLI.
execSync('npm run vumper ' + arg, {stdio:[0, 1, 2]});
execSync('npm run format', {stdio:[0, 1, 2]});
package.json
配置您的 my-build 脚本以调用 run.js,如下所示:
...
"scripts": {
"my-build": "node run",
"vumper": "node node_modules/vumper/index.js",
"format": "prettier --single-quote -width=80 --write package.json"
},
...
正在运行my-build 脚本:
根据解决方案 1,要通过 CLI 调用 my-build,您需要运行:
npm run my-build -- dv
说明: