gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:32:52 24 4
gpt4 key购买 nike

我的 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 脚本,其中 <arg-here>通过 CLI 提供;

...
"scripts": {
"my-build": "npm run vumper <arg-here> && npm run format",
...
},
...

但是,不幸的是 npm 没有内置功能来实现此目的。

特殊的 npm 选项 -- ,(有关此选项的更多信息,请参阅下面解决方案 1 的末尾),只能用于将参数传递给脚本的 END,但不能传递到中间。因此,如果您的两个命令的顺序相反,则 --选项可以像这样使用:

...
"scripts": {
"my-build": "npm run format && npm run vumper --",
...
},
...

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

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

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

<小时/>

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

配置您的my-build scripts 中的脚本package.json 的部分来调用 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> 时命令才会运行命令成功完成(即返回 0 退出代码)。

正在运行 my-build脚本:

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

npm run my-build -- dv

注意:

  1. 在本例中,尾随 dv部分是将传递给您的 vumper 的参数脚本。

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

    ... The special option -- is used by getopt to delimit the end of the options. npm will pass all the arguments after the -- directly to your script: ... The arguments will only be passed to the script specified after npm run and not to any pre or post script.

<小时/>

解决方案 2 - 跨平台:

对于跨平台解决方案(可以与 Bash、Windows 命令提示符/cmd.exe 和 PowerShell 等成功配合使用的解决方案),您需要使用 Nodejs 帮助程序脚本,如下所示。

run.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]});

package.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,调用 my-build通过 CLI,您需要运行:

npm run my-build -- dv

说明:

  • run.js 利用 process.argv 获取通过 CLI 传递的参数(例如 dv )。如果运行时没有提供参数npm run my-build默认值(即 dv )被传递到 vumper npm 脚本。

  • run.js 还利用 child_process.execSync(...) shell-out/调用两个 npm run命令。

关于npm - 将命令行参数传递给 package.json 中的 npm 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51388921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com