从npm传递键值参数

时间:2018-11-06 14:19:40

标签: node.js npm arguments command-line-interface yargs

因此,我很努力地将命令行选项参数从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','BAR']

很棒,可以,但是如果我尝试

$ npm run test FOO --BAR 99RedBalloons

我得到:

  

['FOO','99RedBallons']

$ npm运行测试FOO --BAR = 99RedBallons 给我:

  

['FOO']

什么?因此,我的问题确实是,使用“ run npm <>”并假设为yargs(因为我认为这是最受欢迎的软件包),如何获得带有[。“ FOO”,“ Bar”: 99RedBalloons“]。

谢谢!

1 个答案:

答案 0 :(得分:2)

是的,您是对的,根据npm documentation,您必须传递额外的“-”来指定 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' ]