将命令行参数传递给package.json中的npm脚本
我的package.json中有以下脚本:将命令行参数传递给package.json中的npm脚本,npm,package.json,npm-scripts,Npm,Package.json,Npm Scripts,我的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
"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脚本,,如下所示:
package.json
。。。
“脚本”:{
“我的构建”:“func(){npm run vumper\“$1\”&&npm run format;};func”,
“vumper”:“node node_modules/vumper/index.js”,
“格式”:“更漂亮--单引号-宽度=80--写package.json”
},
...
说明:
名为func
的Bash函数执行以下操作:
首先运行npm运行vumper/参数)
随后,它通过命令npm run format
运行名为format
的脚本
这两个npm run
命令使用&
操作符链接,因此第二个npm run format
命令只有在初始npm run vumper将--
选项描述为:
。。。特殊选项--
用于限定选项的结尾。npm将把--
后面的所有参数直接传递给脚本:。。。参数将仅传递给npm run
之后指定的脚本,而不会传递给任何pre或post脚本
解决方案2-跨平台:
对于跨平台解决方案(成功地与Bash、Windows命令提示符/cmd.exe和PowerShell等配合使用的解决方案),您需要使用如下nodejs帮助程序脚本
run.js
让我们将nodejs脚本命名为run.js,并将其保存在projects根目录中,与package.json处于同一级别
const execSync=require('child_process')。execSync;
常量arg=process.argv[2]||“dv”;//如果通过CLI未提供参数,则默认值为'dv'。
execSync('npm run vumper'+arg,{stdio:[0,1,2]});
execSync('npm运行格式',{stdio:[0,1,2]});
package.json
将my build
脚本配置为调用run.js,如下所示:
。。。
“脚本”:{
“我的构建”:“节点运行”,
“vumper”:“node node_modules/vumper/index.js”,
“格式”:“更漂亮--单引号-宽度=80--写package.json”
},
...
运行我的构建脚本:
根据解决方案1,要通过CLI调用my build
,您需要运行:
npm运行我的构建--dv
说明:
- run.js用于获取通过CLI传递的参数(例如,
dv
)。如果在运行npm run my build
时未提供任何参数,则默认值(即dv
)将传递给vumper
npm脚本
- run.js还利用来抛出/调用两个
npm run
命令
Npm现在有一个内置选项,可以将cli参数直接传递给脚本。
cli参数存储在前缀为npm\u config
的环境变量中,它们需要非常严格的语法,格式为-->=
例如:
"my-build": "npm run vumper %npm_config_myflag% && npm run format",
在终端中,运行npm run my build--myflag=my_value
以执行npm run vumper my_value&&npm run format
注:
要在npm脚本中引用环境变量,必须使用特定于平台的语法,即Windows中的%npm\u config\u myflag%
,或Linux中的$npm\u config\u myflag
更新:
要避免与用于配置npm本身的npm_配置变量发生冲突的风险,只需在参数前面加上唯一的前缀,例如应用程序的名称
潜在冲突是一个非常常见的问题,适用于许多环境:任何应用程序都可以使用其他应用程序已经使用的环境变量;因此,环境变量通常以应用程序的名称作为前缀(例如NVM_HOME、JAVA_HOME)。但这种潜在冲突并不是避免使用环境变量的好理由。我认为这同样适用于npm参数/npm_配置环境变量。没有提到冲突的风险,这意味着我想应该像往常一样管理冲突。我首选的方法是使用环境变量:
{
“脚本”:{
“ncc构建”:“ncc构建$ACTION/src/index.ts-o$ACTION/dist”,
“构建:pr变更日志”:“操作=pr变更日志npm运行ncc构建”,
}
}
它应该在UNIX系统中工作。不过,我不确定windows平台是否兼容。是否有一个cli npm包可以简单地执行类似于const args=process.argv.slice(3)
const命令=args.reduce(
(res,arg,index)=>res.replace(新的RegExp(\\\${index+1},'g'),arg),
process.argv[2]
)代码>const execSync=require('child_process')。execSync代码>execSync(命令,{stdio:[0,1,2]})代码>?。这样我就可以用\“并使用这样的cli作为前缀,运行任何带有有序参数的脚本……平台特定是我的关键。我在Windows上尝试了$npm\u config\u myflag
,失去了我的心智npm也为内部目的创建了自己的名为npm\u config.*
的环境变量。确保为标记/选项选择一个名称(例如,--myflag=*
),该名称不会覆盖内部使用的名称,因为这可能会产生不需要的结果。您可以cd
到您的项目目录并运行npmru