作者:castellaniygw_623 | 来源:互联网 | 2022-12-10 13:21
我在package.json中有以下脚本:
"scripts": {
"vumper": "node node_modules/vumper/index.js",
"format": "prettier --single-quote -
},
'vumper'包接受命令行参数(例如'dv').我希望能够做的是拥有一个连续运行这两个命令的命令.
基本上,我希望能够运行:
npm run vumber dv
然后
npm run format
但在一个命令中,类似于
npm run my-build dv
这将运行上述两个命令,正确接受命令行参数'dv'并将其传递给第一个npm run vumper.这可能吗?
1> RobC..:
简答:
基本上,你想要的是拥有这样的npm脚本,
通过CLI提供;
...
"scripts": {
"my-build": "npm run vumper && npm run format",
...
},
...
但是,不幸的是,npm没有内置功能来实现这一目标.
特殊的npm选项--
(请参阅下面的解决方案1的结尾以获取有关此选项的更多信息),只能用于将参数传递给脚本的END但不能传递给MIDDLE.因此,如果您的两个命令顺序相反,则--
可以使用以下选项:
...
"scripts": {
"my-build": "npm run format && npm run vumper --",
...
},
...
要克服没有内置功能将参数传递到脚本的MIDDLE的限制,请考虑以下解决方案:
有关仅限Bash的解决方案,请参阅"解决方案1"部分.
如果需要跨平台支持,请遵循"解决方案2"部分中描述的解决方案.
解决方案1 - Bash(MacOS/Linux/etc ..):
my-build
在package.jsonscripts
部分配置脚本以调用Bash shell函数,如下所示:
的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 -
},
...
说明:
命名的Bash函数func
执行以下操作:
首先运行npm run vumper
.由此,
将通过CLI传递的shell参数.它在脚本中引用$1
(即第一个位置参数 /参数).
随后它运行format
通过命令命名的脚本npm run format
.
这两个npm run
命令使用&&
运算符链接,因此第二个npm run format
命令仅在初始npm run vumper
命令成功完成时运行(即返回0
退出代码).
运行my-build
脚本:
要my-build
通过CLI 调用,您需要运行:
npm run my-build -- dv
注意:
在这种情况下,尾随dv
部分是将传递给您的vumper
脚本的参数.
--
必须在参数之前指定特殊选项.该文档描述的--
选项为:
...特殊的选项--
是使用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 -
},
...
运行my-build
脚本:
根据解决方案1,要my-build
通过CLI 调用,您需要运行:
npm run my-build -- dv
说明:
run.js利用process.argv
以获得通过CLI(例如传入的参数dv
).如果在运行npm run my-build
默认值时没有提供参数,则(即dv
)将传递给vumper
npm-script.
run.js 还利用child_process.execSync(...)
到壳出 /调用两个npm run
命令.
我实施了解决方案1,效果很好