首页 > 解决方案 > 将命令行参数传递给 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。这可能吗?

标签: npmpackage.jsonnpm-scripts

解决方案


简短的回答:

本质上,您想要的是有一个类似这样的 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 的限制,请考虑以下解决方案:

  1. 对于仅 Bash 的解决方案,请参阅“解决方案 1”部分。

  2. 如果需要跨平台支持,请遵循“解决方案 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执行以下操作:

  1. 首先运行npm run vumper <arg>。其中<arg>将是通过 CLI 传递的 shell 参数。它在脚本中使用$1(即第一个位置参数/argument)来引用。
  2. 随后它运行format通过命令命名的脚本npm run format

这两个npm run 命令使用&&运算符链接在一起,因此第二个npm run format命令只有在初始命令成功完成时才会运行npm run vumper <arg>(即返回0退出代码)。

运行my-build脚本:

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

npm run my-build -- dv

笔记:

  1. 在这种情况下,尾随dv部分是将传递给您的vumper脚本的参数。

  2. --必须在参数之前指定特殊选项。文档将选项描述--为:

    ...特殊选项--用于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)时未提供任何参数,则将其传递给vumpernpm-script。

  • run.js 还利用child_process.execSync(...)外壳/调用这两个npm run命令。


推荐阅读