关于javascript:npm脚本使用yargs将参数/参数传递给节点脚本

npm script pass parameters/arguments to node script using yargs

当用作NPM脚本参数时,是否可以调用以从yargs中检索键?

OSX终端中的用户类型:

1
npm run scaffold --name=blah

在package.json中执行:

1
"scaffold" :"node ./scaffold/index.js --"

这导致

1
2
3
4
5
6
7
8
9
10
11
const yargs = require('yargs').argv

if (yargs) {
  console.log(yargs);
  console.log(yargs.name);
  process.exit(1)
}
...
result:
{ _: [], '$0': 'scaffold/index.js' }
undefined

只有当我在package.json "scaffold" :"node scaffold/index.js --name=blah"中硬编码时,这才有效,但我需要这是可配置的。

正如我所说,我使用的是args,因为它看起来可以很容易地按名称(而不是数组)检索键。乐于接受建议。

我错过了什么?

更新日期:2017年7月11日相关:向NPM脚本发送命令行参数

但是,通过命令行1: npm run scaffold name=hello
2: npm run scaffold --name=hello生成:

1
2
1: { _: [], '$0': 'scaffold/index.js' }
2: { _: [ 'name=hello' ], '$0': 'scaffold/index.js' }

仍然找不到检索yargs.name属性的方法。仍然未定义。


更新日期:2017年7月13日

目前,我已经放弃了。这似乎是不可能的。我在终端中手动运行脚本。例如。

1
node ./scaffold/index.js --name=blah

下图显示了直接执行节点脚本,而不是运行NPM脚本。我已经添加了https://www.npmjs.com/package/nopt节点模块,看看它是否有帮助(它没有)。在运行NPM脚本时,process.argv.name仍然是未定义的。

enter image description here

更新日期:2017年7月18日

添加了github示例:https://github.com/sidouglas/stackoverflow-node-arguments

更新日期:2017年7月24日

在命令开始前添加变量与npm run scaffold myvar="hello world"相反的myvar="hello npm run scaffold


[email protected]开始,在执行脚本时可以使用自定义参数。getopt使用特殊选项--来分隔选项的结尾。NPM将把后面的所有参数直接传递给脚本:

npm run test -- --grep="pattern"

https://docs.npmjs.com/cli/run-script(运行脚本)


我不确定在命令行中添加变量的位置是否重要,如果您不关心这一点,那么这是有效的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//package.json
{
 "name":"npm-test",
 "version":"1.0.0",
 "description":"",
 "main":"index.js",
 "dependencies": {},
 "devDependencies": {},
 "scripts": {
   "start":"node index.js"
  },
 "author":"",
 "license":"ISC"
}

您的JS文件:

1
2
//index.js
console.log('myvar', process.env.myvar);

命令行命令:

1
myvar="hello world" npm run start

所以最后,只需在npm脚本命令前面加上参数列表。