问题描述
我有一个接受命令行参数的 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);