首页 > 解决方案 > 使用 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', 'pages')
  .describe('p', 'number of pages; infinite by default')
  .number('p')

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

如何在将参数视为可选参数时给出默认值;所以,当它没有设置时没有默认值,只有在没有值的情况下设置为默认值。


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

标签: node.jsyargs

解决方案


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

一种解决方案是删除默认值并在 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);

推荐阅读