使用 yargs 将默认数值添加到可选参数

问题描述

我有一个接受命令行参数的 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','number of pages; infinite by default')
  .number('p')

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

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


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

解决方法

我不相信 yargs 有这样的方法,我想使用 #coerce(),但是无论命令行是否有 -p,该函数都会被调用,所以它不会t 工作(除非您在 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);