npm - 将命令行参数传递给 package.json 中的 npm 脚本
问题描述
我的 package.json 中有以下脚本:
"scripts": {
"vumper": "node node_modules/vumper/index.js",
"format": "prettier --single-quote -width=80 --write package.json"
},
'vumper' 包接受命令行参数(例如 'dv')。我想做的是有一个命令可以连续运行这两个命令。
本质上,我希望能够运行:
npm run vumber dv
接着
npm run format
但在一个命令中,类似
npm run my-build dv
它将运行上述两个命令,正确接受命令行参数“dv”并将其传递给第一个 npm run vumper。这可能吗?
解决方案
简短的回答:
本质上,您想要的是有一个类似这样的 npm-script,<arg-here>
通过 CLI 提供;
...
"scripts": {
"my-build": "npm run vumper <arg-here> && 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..):
在package.json部分配置您的my-build
脚本以调用 Bash shell 函数,如下所示:scripts
包.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"
},
...
解释:
命名的 Bash 函数func
执行以下操作:
- 首先运行
npm run vumper <arg>
。其中<arg>
将是通过 CLI 传递的 shell 参数。它在脚本中使用$1
(即第一个位置参数/argument)来引用。 - 随后它运行
format
通过命令命名的脚本npm run format
。
这两个npm run
命令使用&&
运算符链接在一起,因此第二个npm run format
命令只有在初始命令成功完成时才会运行npm run vumper <arg>
(即返回0
退出代码)。
运行my-build
脚本:
要通过 CLI 调用my-build
,您需要运行:
npm run my-build -- dv
笔记:
在这种情况下,尾随
dv
部分是将传递给您的vumper
脚本的参数。--
必须在参数之前指定特殊选项。文档将选项描述--
为:...特殊选项
--
用于getopt
分隔选项的结尾。npm 会将所有参数--
直接传递给您的脚本: ...参数只会传递给之后指定的脚本,npm run
而不是任何 pre 或 post 脚本。
解决方案 2 -跨平台:
对于跨平台解决方案(与 Bash、Windows 命令提示符/cmd.exe 和 PowerShell 等一起成功运行的解决方案),您需要使用 nodejs 帮助脚本,如下所示。
运行.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]});
包.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
解释:
run.js用于
process.argv
获取通过 CLI 传递的参数(例如dv
)。如果在运行npm run my-build
默认值(即dv
)时未提供任何参数,则将其传递给vumper
npm-script。run.js 还利用
child_process.execSync(...)
外壳/调用这两个npm run
命令。
推荐阅读
- eclipse - 使用 tableviewer swt/jface 显示大量行/列是否有任何限制
- c++ - 在编译时从函数定义生成 switch-case
- vhdl - 为 VHDL 代码估计 FPGA 中的逻辑门数量
- regex - .net 正则表达式 - 在最后一个 ` 之前不包含句号的字符串
- ` - 尝试 2
- virtual-machine - 卸载virtualbox后删除虚拟机
- ios - UNNotificationAction 有时不会显示在远程通知中
- java - 在 azure 中找不到该网址的网页
- css - 如何在没有任何内容的情况下覆盖锚焦点规则?
- swift - 变量视图中的值与控制台视图不同
- c# - 发送 httpclient 请求时出现 SocketException