如何向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
相关产品推荐
相关产品推荐

