1

所以我正在努力将命令行选项参数从 npm 传递到节点脚本。我可以自己传递选项,但不能作为键值对。

对于我的 package.json 我有:

"scripts": {
   "test": ". ./.env; node app.js --"
 },

(我的理解是,对于 npm,您需要包含和额外的“--”来传递参数)并且在我的 app.js 中我有:

const { argv, options } = require('yargs');
console.log(argv._);

当我跑

$ npm run test FOO BAR

我得到:

['FOO','酒吧']

太好了,这很有效,但如果我尝试

$ npm run test FOO --BAR 99RedBalloons

我得到:

['FOO','99RedBallons']

$ npm run test FOO --BAR=99RedBallons 给了我:

['FO']

世界卫生大会?所以,我的问题真的是,使用“run npm <>”并且我假设 yargs(因为我相信这是最流行的包),我怎么能用 ["FOO", "Bar" 的 arg._ 到达:" 99个红气球”]。

谢谢!

4

1 回答 1

2

是的,你是对的,根据npm 文档,你必须传递额外的“--”来指定npm脚本的参数,但你没有在正确的地方传递它。

您不需要在package.json“测试”脚本的末尾传递它,而是直接在调用脚本的命令行中传递它。

这样,npm就会理解它是您的脚本的参数,而不是npm命令本身的参数:

// cli
$ npm run test -- FOO --BAR 99RedBalloons    // "--" before arguments
  /* or */
$ npm run test -- FOO --BAR=99RedBalloons

// package.json
"scripts": {
   "test": ". ./.env; node app.js"
 }

// app.js
const { argv } = require('yargs');
console.log(argv);

// -> { _: [ 'FOO' ], BAR: '99RedBalloons', '$0': 'app.js' }

我没有找到yargs内置选项来执行此操作,但或者,如果您希望_数组变量中的所有参数,您可以执行以下操作:

for (let cmd in argv)
  if (cmd !== '$0' && cmd !== '_')
    argv._[cmd] = argv[cmd]

console.log(argv._)

// -> [ 'FOO', BAR: '99RedBalloons' ]
于 2018-11-06T19:39:12.030 回答