0

我正在尝试为我正在创建的 Node.js 程序传递 2 个强制参数。

我习惯Yargs这样做:

const yarg = require("yargs")
.usage("hi")
.options("m", {demandOption: true})
.options("m2", {demandOption: true})
.argv;

这工作正常,有一个小问题。我想像这样激活脚本:

节点 index.js -m val -m2 val2

它不起作用,我收到一条错误消息,提示缺少 m2。只有当我-在 m2 之前添加另一个它才有效,这意味着我必须这样做:

节点 index.js -m val1 --m2 val2

有没有办法让它像我一开始想要的那样接受参数?

4

1 回答 1

0

你不能用 yargs 做你要求的事情,而且可以说你不应该这样做。通过查看您提到的不同参数样式的yargs-parser(模块 yargs 用于解析您的参数)返回什么,很容易看出为什么不能:

console.log(yargsParser(['-m', 'A']));
console.log(yargsParser(['-m2', 'B']));
console.log(yargsParser(['--m2', 'C']));
<script src="https://bundle.run/yargs-parser@11.1.1"></script>

如你看到的:

  1. -m A被解析为m带有 value的选项A
  2. -m2 B被解析为m带有值的选项,2以及单独的数组参数B
  3. --m2 C被解析为m2带有 value的选项C

没有办法使解析器表现不同。这是有充分理由的:大多数命令行工具(尽管是 Windows)都以这种方式运行。

按照几十年的惯例,“长”选项使用两个破折号,后跟一个人类可读的名称,例如--max-count. -m“短”选项,通常是长选项的别名,使用单个破折号后跟单个字符,如省略。这就是为什么当 yargs 看到 时-m2,它假定2m选项的值。

如果您想使用 yargs(而不是让精通命令行的用户感到困惑),您需要将您的选项更改为 1. --mand --m2or, 2. -mand (for example) -n

于 2019-01-10T19:56:39.830 回答