1 个不稳定版本
0.1.0 | 2019 年 9 月 16 日 |
---|
#2323 in 解析器实现
9,157 个月下载量
用于 8 个 crate (6 直接)
65KB
1.5K SLoC
以与 Go 的 flag
兼容的方式为主,专注于命令行解析。
设计目标
Go 带有内置的命令行解析支持:flag
库。众所周知,它与 GNU 惯例不兼容,例如
- 短/长标志。POSIX/GNU 标志有时会有短标志和长标志一对,如
-f
/--force
或-n
/--lines
。flag
没有这样的区别。 - 组合短标志。在 POSIX/GNU 惯例中,
-fd
表示-f
加-d
。flag
将其解析为一个名为fd
的单个标志。 - 在参数后面的标志。POSIX/GNU 允许标志出现在位置参数之后,如
./command arg1 --flag arg2
,除非显式地通过--
分隔。flag
将其解析为一系列连续的位置参数。
该 go-flag
crate 设计目的是允许 Rust 程序员轻松地将使用 flag
编写的 Go CLI 程序移植,而不会破坏兼容性。
因此,我们的优先级如下
- 行为兼容性。它的目的是与 Go 内置的
flag
库在命令行行为上兼容。请注意,API 兼容性(相似性)是另一回事。 - 迁移。无法使用更复杂的解析器如
structopt
是痛苦的。因此,这个库提供了检查典型不兼容使用的功能,以允许逐步迁移。 - 简单性。这个库并不打算提供完整的解析器功能。例如,子命令解析不在此库的范围内。如果您想扩展程序以接受更复杂的标志,请尝试迁移到例如
structopt
。
示例
通常您可以使用 parse
函数。
let mut force = false;
let mut lines = 10_i32;
let args: Vec<String> = go_flag::parse(|flags| {
flags.add_flag("f", &mut force);
flags.add_flag("lines", &mut lines);
});
如果您需要一个文件路径列表,使用 PathBuf
或 OsString
允许使用非UTF8字符串。
use std::path::PathBuf;
let args: Vec<PathBuf> = go_flag::parse(|_| {});
如果检测到不兼容的使用,parse
会发出警告并继续处理。您可以使用 parse_with_warnings
改变这种行为。
例如,自从您的Rust端口首次发布以来已经过去足够长的时间,您可以通过指定 WarningMode::Error
开始拒绝不兼容的使用。
use go_flag::WarningMode;
let mut force = false;
let mut lines = 10_i32;
let args: Vec<String> =
go_flag::parse_with_warnings(WarningMode::Error, |flags| {
flags.add_flag("f", &mut force);
flags.add_flag("lines", &mut lines);
});
依赖项
~8KB