You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向npm-run-script传递参数并通过commander.js读取?

如何通过npm-run-script向commander.js传递参数?

问题场景

要实现通过npm-run-script传递标记/选项,并让commander.js读取这些参数,现有代码如下:

package.json

{
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "commander": "^12.1.0"
  }
}

index.js

const { program } = require("commander");

program.option("-p --config-path <path>", "config path", ".").parse();
console.log(`options: ${ JSON.stringify(program.opts()) }`);

直接运行node index.js -p "/path/foo/boo"或node index.js --config-path="/path/foo/boo"时,输出符合预期:

options: {"configPath":"/path/foo/boo"}

但使用npm start -- -p="/path/foo/boo"或npm start -- --config-path="/path/foo/boo"时,commander.js只能获取到默认值.,输出为:

> start
> node index.js

options: {"configPath":"."}

解决方案

可以实现正确传递,问题出在参数格式上——不要用等号连接选项和值,改用空格分隔,或者调整引号包裹方式。

推荐写法

两种正确的传递命令:

  • 短选项格式:
npm start -- -p "/path/foo/boo"
  • 长选项格式:
npm start -- --config-path "/path/foo/boo"

运行后即可得到预期输出:

> start
> node index.js

options: {"configPath":"/path/foo/boo"}

备选写法(可读性较差)

如果要保留等号,需将整个选项用引号包裹,避免npm解析异常:

npm start -- "-p=/path/foo/boo"

原因说明

npm在传递--后的参数时,会对选项=值格式的参数做特殊转义处理,导致commander.js无法正确识别选项对应的值;而空格分隔的选项 值格式能被npm和commander.js同时正确解析。

内容的提问来源于stack exchange,提问作者babinik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:08:25