【问题标题】:add default numerical value to optional argument with yargs使用 yargs 将默认数值添加到可选参数
【发布时间】:2021-06-25 21:12:53
【问题描述】:

我有一个接受命令行参数的 cli 脚本。
对于 pages 参数,我希望行为是:

> script.js

-> pages 参数未设置。不处理页面

> script.js -p 100

-> pages 参数设置为 100:处理 100 个页面

> script.js -p

-> pages 参数集没有值:处理无限(无论多少可用)页面

换句话说:我想给一个可选参数一个默认值。问题是我不知道如何区分用户设置的没有价值的情况和没有设置的情况。

当这样定义时:

  var argv = require('yargs')
  // omitted code
  .alias('p', 'pages')
  .describe('p', 'number of pages; infinite by default')
  .default('p', -1)
  .number('p')

argv.pages 始终是-1,无论我是否设置-p

当这样定义时:

  .alias('p', 'pages')
  .describe('p', 'number of pages; infinite by default')
  .number('p')

typeof argv.pages 始终是undefined,无论我是否设置-p

如何在将参数视为可选参数的同时给出默认值;所以,没有设置的时候没有默认值,没有值的时候只有默认值。


(当然有一个解决方法:我可以通过循环 process.argv 来手动解析参数,但我想避免这种情况,因为这违背了使用 yargs 的目的)

【问题讨论】:

  • 似乎它根本没有处理命令行参数。您可以尝试其他选项,看看是否是这种情况?还需要知道 yargs 版本,以及如何调用参数解析器。 (.argv, .parse, .parseSync)
  • 我在描述我将命令行值留空的情况(因此,“no -p”参数与“-p without value”。如果我添加一个值(“-p 100” ) 然后它被拾取。所以它肯定会拾取命令行参数

标签: node.js yargs


【解决方案1】:

我不相信 yargs 有这样的方法,我想使用 #coerce(),但是无论命令行是否有 -p,都会调用该函数,所以它不起作用(除非您在 process.argv 中检查了“-p”和“--pages”)。

一种解决方案是删除默认值并在 yargs 完成后对其进行修改。如果您删除默认值并指定-p,则在 argv 中它将是未定义的。如果您根本不指定 -p,则它根本就不是属性。

script -p 100 // => { _: [], $: "", pages: 100, p: 100 }
script -p // => { _: [], $: "" pages: undefined, p: undefined }
script // => { _: [], $: "" }

现在我们可以检查对象中是否存在页面但未定义,然后做任何事情:

var argv = require('yargs')
    // omitted code
    .alias('p', 'pages')
    .describe('p', 'number of pages; infinite by default')
    .number('p').argv;

if ('pages' in argv && typeof argv.pages === 'undefined') {
    // set to whatever you want
    argv.pages = Infinity;
    argv.p = Infinity;
}

console.log(argv);

【讨论】:

    猜你喜欢
    • 2013-09-29
    • 2010-09-23
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多