将参数传递给Node.js程序

时间:2019-01-10 15:12:11

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

我正在尝试为正在创建的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

是否有一种方法可以让它像我想的那样接受参数?

1 个答案:

答案 0 :(得分:0)

您无法使用yargs来完成您要求的操作,并且可以说您不应该这样做。通过查看针对您提到的不同参数样式的yargs-parser(yargs模块用来解析参数)返回的结果,很容易看出为什么不能这样做:

Parent
console.log(yargsParser(['-m', 'A']));
console.log(yargsParser(['-m2', 'B']));
console.log(yargsParser(['--m2', 'C']));

如您所见:

  1. <script src="https://bundle.run/yargs-parser@11.1.1"></script>被解析为选项-m A,其值为m
  2. A被解析为选项-m2 B,其值为m,并分别解析为数组参数2
  3. B被解析为选项--m2 C,其值为m2

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

按照数十年的惯例,“长”选项使用两个破折号后跟一个易于理解的名称,例如C。 “短”选项通常是长选项的别名,它使用单破折号后跟单个字符,例如--max-count,并且-这是至关重要的位-如果该选项取一个值,则该选项之间的空格并且该值可以省略。这就是为什么当yargs看到-m时,它假定-m22选项的值。

如果您想使用yargs(而不是混淆命令行的用户),则需要将选项更改为1. m--m或2。{{1 }}和(例如)--m2