将命令行参数传递给package.json中的npm脚本

时间:2018-07-17 19:28:53

标签: 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 format

但是在一个命令中,类似于

npm run my-build dv

可以运行以上两个命令,正确接受命令行参数'dv'并将其传递给第一个npm run vumper。这可能吗?

4 个答案:

答案 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 --",
  ...
},
...

要克服没有内置功能将参数传递到脚本中间的局限性,请考虑以下解决方案:

  1. 有关仅限Bash的解决方案,请参见“解决方案1” 部分。

  2. 如果需要跨平台支持,请遵循“解决方案2” 部分中所述的解决方案。


解决方案1- Bash(MacOS / Linux /等)

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函数执行以下操作:

  1. 首先运行npm run vumper <arg><arg>是通过CLI传递的shell参数。在脚本中使用$1(即第一个positional parameter /自变量)对其进行引用。
  2. 随后,它通过命令format运行名为npm run format的脚本。

这两个npm run命令使用&&运算符链接,因此第二个npm run format命令仅在初始npm run vumper <arg>命令成功完成(即返回{ {1}}退出代码)。

运行0脚本:

要通过您的CLI调用my-build,您需要运行:

my-build

注意:

  1. 在这种情况下,结尾的npm run my-build -- dv 部分将作为参数传递给您的dv脚本。

  2. 必须在参数前指定特殊选项vumperdocs--选项描述为:

      

    ... getopt使用特殊选项--来分隔选项的末尾。 npm会将--之后的所有参数直接传递到您的脚本:...这些参数仅传递给--之后指定的脚本,而不传递给任何前置或后置脚本。


解决方案2-跨平台

对于跨平台解决方案(一种可以与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(...) shell /调用两个vumper命令。

    < / li>

答案 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"
相关问题