我的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。这可能吗?
答案 0 :(得分:12)
本质上,您想要的是具有这样的npm脚本,其中<arg-here>
是通过CLI提供的;
...
"scripts": {
"my-build": "npm run vumper <arg-here> && npm run format",
...
},
...
但是,不幸的是,npm没有内置功能来实现此目的。
特殊的npm选项--
(有关此选项的更多信息,请参阅下面的解决方案1 的末尾),只能用于将参数传递给结束,但不在中间。因此,如果两个命令的顺序相反,则可以像这样使用--
选项:
...
"scripts": {
"my-build": "npm run format && npm run vumper --",
...
},
...
要克服没有内置功能将参数传递到脚本中间的局限性,请考虑以下解决方案:
有关仅限Bash的解决方案,请参见“解决方案1” 部分。
如果需要跨平台支持,请遵循“解决方案2” 部分中所述的解决方案。
在 package.json 的my-build
部分中配置scripts
脚本,以调用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 /自变量)对其进行引用。format
运行名为npm run format
的脚本。这两个npm run
命令使用&&
运算符链接,因此第二个npm run format
命令仅在初始npm run vumper <arg>
命令成功完成(即返回{ {1}}退出代码)。
运行0
脚本:
要通过您的CLI调用my-build
,您需要运行:
my-build
注意:
在这种情况下,结尾的npm run my-build -- dv
部分将作为参数传递给您的dv
脚本。
必须在参数前指定特殊选项vumper
。 docs将--
选项描述为:
...
getopt
使用特殊选项--
来分隔选项的末尾。 npm会将--
之后的所有参数直接传递到您的脚本:...这些参数仅传递给--
之后指定的脚本,而不传递给任何前置或后置脚本。
对于跨平台解决方案(一种可以与Bash,Windows Command Prompt / cmd.exe和PowerShell等成功使用的解决方案),您需要按如下方式使用nodejs帮助程序脚本。
run.js
将其命名为nodejs脚本 run.js ,并将其保存在与 package.json 相同级别的项目根目录中。
npm run
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]});
脚本以如下方式调用 run.js :
my-build
运行...
"scripts": {
"my-build": "node run",
"vumper": "node node_modules/vumper/index.js",
"format": "prettier --single-quote -width=80 --write package.json"
},
...
脚本:
根据解决方案1 ,要通过您的CLI调用my-build
,您需要运行:
my-build
说明:
run.js 利用process.argv
来获取通过CLI传递的参数(例如npm run my-build -- dv
)。如果在运行dv
时未提供任何参数,则默认值(即npm run my-build
)将传递到dv
npm-script。
run.js 还利用child_process.execSync(...)
来vumper
命令。
答案 1 :(得分:2)
Npm现在具有 一个内置选项,可将cli参数直接传递给脚本。
cli参数存储在前缀为npm_config_<flagname>
的环境变量中,它们要求语法非常严格,格式为--<flagname>=<flagvalue>
。
示例:
"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_config_myflag%
或Linux中为$npm_config_myflag
。
答案 2 :(得分:1)
我的首选方法是使用环境变量:
{
"scripts": {
"ncc-build": "ncc build $ACTION/src/index.ts -o $ACTION/dist",
"build:pr-changelog": "ACTION=pr-changelog npm run ncc-build",
}
}
它应该适用于 UNIX 系统。不过,我不确定 Windows 平台的兼容性。
答案 3 :(得分:0)
我认为您可以同时使用。
https://www.npmjs.com/package/concurrently
您必须先同时安装,然后按如下所述使用它,
可以使用参数运行多个命令
因此,您的情况将是
concurrently "npm:vumber dv" "npm:format"