如果你想写一个选项解析器,并有它好,有 两种方法。 道而道而道之错.
错误的方法是坐下来写一个选项解析器 。 我们都做了 那个.
正确的方式是写一些复杂的可配置程序 选项,你达到极限 你的挫折只是试图 全部管理,然后用胶带溶液延后到看到 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}最后拍出一张 很棒的选项解析器.
如果您想要写入选项解析器, 请不要写入选项解析器 . 写入软件包管理器或源控制系统或服务 重启器,或操作系统. 你可能不会有一个 如果你不放弃,你就是无情的 在你的拖延中,你勤奋, 你可能只是结束一个非常 不错的选项解析器.
用户
// my-program.js
var nopt = require("nopt")
, Stream = require("stream").Stream
, path = require("path")
, knownOpts = { "foo" : [String, null]
, "bar" : [Stream, Number]
, "baz" : path
, "bloo" : [ "big", "medium", "small" ]
, "flag" : Boolean
, "pick" : Boolean
, "many1" : [String, Array]
, "many2" : [path, Array]
}
, shortHands = { "foofoo" : ["--foo", "Mr. Foo"]
, "b7" : ["--bar", "7"]
, "m" : ["--bloo", "medium"]
, "p" : ["--pick"]
, "f" : ["--flag"]
}
// everything is optional.
// knownOpts and shorthands default to {}
// arg list defaults to process.argv
// slice defaults to 2
, parsed = nopt(knownOpts, shortHands, process.argv, 2)
console.log(parsed)
这将为以下任何一项提供支持:
$ node my-program.js --foo "blerp" --no-flag
{ "foo" : "blerp", "flag" : false }
$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag
{ bar: 7, foo: "Mr. Hand", flag: true }
$ node my-program.js --foo "blerp" -f -----p
{ foo: "blerp", flag: true, pick: true }
$ node my-program.js -fp --foofoo
{ foo: "Mr. Foo", flag: true, pick: true }
$ node my-program.js --foofoo -- -fp # -- stops the flag parsing.
{ foo: "Mr. Foo", argv: { remain: ["-fp"] } }
$ node my-program.js --blatzk -fp # unknown opts are ok.
{ blatzk: true, flag: true, pick: true }
$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value
{ blatzk: 1000, flag: true, pick: true }
$ node my-program.js --no-blatzk -fp # unless they start with "no-"
{ blatzk: false, flag: true, pick: true }
$ node my-program.js --baz b/a/z # known paths are resolved.
{ baz: "/Users/isaacs/b/a/z" }
# if Array is one of the types, then it can take many
# values, and will always be an array. The other types provided
# specify what types are allowed in the list.
$ node my-program.js --many1 5 --many1 null --many1 foo
{ many1: ["5", "null", "foo"] }
$ node my-program.js --many2 foo --many2 bar
{ many2: ["/path/to/foo", "path/to/bar"] }
阅读底部的测试 lib/nopt.js 更多实例
这只小狗能做什么.
类型
支持以下类型,并按以下 nopt.typeDefs
- 字符串:一个普通字符串. 没有解析完成.
- 路径:文件系统路径。 如果不是绝对的 Cwd , 则解决.
- url:一个url. 如果它不分析,它不被接受.
- 数字:必须是数字.
- 日期: 必须分析为日期 。 如果有的话
Date是一个选择, 然后返回日期对象,而不是字符串. - 布尔: 必须是两个
true或者说false如果一个选项是一个布尔, 那么它就不需要价值了 它的存在将意味着true作为 这个值。 要否定布尔旗帜,做--no-whatever或者说--whatever false - NaN:表示严格不允许选择. 任何值都会 失败.
- Stream:一个与节点"Stream"类相匹配的对象. 珍贵
用于程序验证。 (npm用这个让你
提供任何在
outfd财务报告和审定财务报表logfd配置选项。 ) - 矩阵: 如果
Array指定为类型之一,然后是数值 将解析为选项列表。 这意味着多重价值 可指定值,并且该值将始终是一个数组.
如果一个类型是本列表中未列出的数组,那么这些就是
视为有效的数值。 例如,在上述例子中
--bloo 选项只能是 "big", (中文(简体) ), "medium",或 "small", (中文(简体) ),
任何价值都会被否决.
当解析未知的字段时, "true", (中文(简体) ), "false",以及 "null" 将会是
被解释为他们的JavaScript等同.
也可以在一个列表中混合类型和值,或者多个类型. 对于
实例 { blah: [Number, null] } 可以设定一个值
数字或无效。 当订购类型时,这意味着
首选项,以及可用于正确解释的第一种类型
将使用该值.
要定义新类型,请添加到 nopt.typeDefs中每个项目
散列是具有 type 委员和 validate 方法。 这个
type 成员是匹配类型列表中的内容的对象。 这个
validate 方法是一个通过 validate(data, key, val)验证方法应指定 data[key] 改为有效
价值 val 如果可以正确处理,或返回布尔
false 如果它不能做到这一点.
您也可以打电话 nopt.clean(data, types, typeDefs) 清理一个
配置对象并删除其无效属性.
处理错误
您可以指定下列方法: nopt 用于通知无效、未知和扩展选项:
nopt.invalidHandler(key, value, type, data) - 当一个值对其选项无效时调用.
nopt.unknownHandler(key, next) - 找到没有配置的选项时调用。 在某些情况下,命令行上的下一个选项会自行解析,而不是作为未知选项的一部分. 在这种情况下 next 将包含该选项.
nopt.abbrevHandler(short, long) - 当一个选项通过缩略语自动翻译时调用.
你可以把这些设置到 false 或任由他们跳过通知.
简称
是的,他们得到了支持。 如果您定义了这样的选项 :
{ "foolhardyelephants" : Boolean
, "pileofmonkeys" : Boolean }
这样就可以了:
node program.js --foolhar --pil
node program.js --no-f --pileofmon
# etc.
简称
Shortwands 是短长的选项名称的散列到片断的参数 他们扩张到.
如果多个单一特征的短指组合起来 组合并没有明确匹配任何其他选项或简称, 然后,他们将被分成若干部分。 例如:
{ "s" : ["--loglevel", "silent"]
, "g" : "--global"
, "f" : "--force"
, "p" : "--parseable"
, "l" : "--long"
}
npm ls -sgflp
# just like doing this:
npm ls --loglevel silent --global --force --long --parseable
其余的坐标
由 nopt 返回的配置对象被赋予一个特殊成员,叫做
argv,它是一个具有以下字段的天体:
remain: 在所有解析完成后剩下的参数 .original:最初出现的rg.cooked:后旗和快手后旗被扩展.
切开
节点程序的名称或多或少使用它出现的精确的 argv
在C地,在取出v8和节点特定选项之后.
因此, argv[0] 总是 node 财务报告和审定财务报表 argv[1] 总是
JavaScript 程序正在运行中 .
这通常对你没有多大用处. 所以他们被切掉
默认。 如果你想要的话,你可以进来了 0 作为最后一个
参数,或者您想切除的起始数字
名单.