Node.js 从npm传递键值参数

Node.js 从npm传递键值参数,node.js,npm,arguments,command-line-interface,yargs,Node.js,Npm,Arguments,Command Line Interface,Yargs,因此,我正在努力将命令行选项参数从npm传递到节点脚本。我可以传递选项本身,但不能作为键值对传递 对于my package.json,我有: "scripts": { "test": ". ./.env; node app.js --" }, (我的理解是,对于npm,您需要包括和额外的“-”来传递参数) 在我的app.js中,我有: const { argv, options } = require('yargs'); console.log(argv._); 当我跑的时候 $ n

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

对于my 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’、‘99个红球’]

$npm运行测试FOO--BAR=99个红球 给我:

['FOO']

什么?所以,我的问题是,使用“run npm”,我假设yargs(因为我认为这是最流行的软件包),我如何能以[“FOO”,“Bar”:“99redballogs”]的参数到达


谢谢

是的,您是对的,根据,您必须传递额外的“-”来指定npm脚本的参数,但是您没有在正确的位置传递它

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

这样,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内置选项来执行此操作,但是,如果希望所有参数都位于
\uu
数组变量中,则可以执行以下操作:

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

console.log(argv._)

// -> [ 'FOO', BAR: '99RedBalloons' ]

是的,您是对的,根据,您必须传递额外的“-”来指定npm脚本的参数,但是您没有在正确的位置传递它

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

这样,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内置选项来执行此操作,但是,如果希望所有参数都位于
\uu
数组变量中,则可以执行以下操作:

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

console.log(argv._)

// -> [ 'FOO', BAR: '99RedBalloons' ]

你试过npm运行test FOO Bar 99 Redballons吗?我试过了,这让我觉得['FOO','Bar','99Redballos']npm如何将命令行参数传递给节点脚本有些奇怪我以为你想要你在评论和问题结尾中说的确切结果。你试过npm运行test FOO Bar 99 Redballons吗?我试过,这给了我['FOO','Bar','99redballogs']我觉得npm是如何将命令行参数传递给节点脚本的,这有点奇怪。我想你想要的是你在评论中所说的确切结果和问题的结尾。