19

用作 npm 脚本参数时,是否可以调用从 yargs 检索密钥?

OSX 终端中的用户类型:

npm run scaffold --name=blah

在 package.json 中执行:

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

这导致

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,因为它似乎可以很容易地按名称检索键(而不是数组)。接受建议。

我错过了什么?

更新 11-07-2017 相关:向 npm 脚本发送命令行参数

但是,传入命令行1: npm run scaffold name=hello OR会2: npm run scaffold --name=hello产生:

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

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


2017 年 7 月 13 日更新

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

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

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

在此处输入图像描述


2017 年 7 月 18 日更新

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


2017 年 7 月 24 日更新

在命令开始之前添加变量, myvar="hello npm run scaffold而不是npm run scaffold myvar="hello world"

4

3 回答 3

12

从 npm@2.0.0 开始,您可以在执行脚本时使用自定义参数。getopt 使用特殊选项 -- 来分隔选项的结尾。npm 会将 -- 之后的所有参数直接传递给您的脚本:

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

https://docs.npmjs.com/cli/run-script

于 2017-07-13T02:03:25.617 回答
7

我不确定在命令行中添加变量的位置是否重要,如果这与您无关,那么这可行:

//package.json
{
  "name": "npm-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {},
  "devDependencies": {},
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "ISC"
}    

你的 JS 文件:

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

和你的命令行命令:

myvar="hello world" npm run start    

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

于 2017-07-23T09:51:55.737 回答
3

对我来说,以下适用于节点 10、12、14

npm run yourscript -- -- --name=bla

我确实需要使用-- --

"yourscript": "node bla.js"
于 2020-09-29T13:02:13.560 回答