1 个不稳定版本

0.1.0 2019 年 9 月 16 日

#2323 in 解析器实现

Download history 2948/week @ 2024-03-14 2096/week @ 2024-03-21 2239/week @ 2024-03-28 2633/week @ 2024-04-04 2251/week @ 2024-04-11 2163/week @ 2024-04-18 2022/week @ 2024-04-25 1772/week @ 2024-05-02 1974/week @ 2024-05-09 2347/week @ 2024-05-16 2237/week @ 2024-05-23 2269/week @ 2024-05-30 1870/week @ 2024-06-06 2301/week @ 2024-06-13 2880/week @ 2024-06-20 1667/week @ 2024-06-27

9,157 个月下载量
用于 8 个 crate (6 直接)

MIT/Apache

65KB
1.5K SLoC

以与 Go 的 flag 兼容的方式为主,专注于命令行解析。

设计目标

Go 带有内置的命令行解析支持:flag 库。众所周知,它与 GNU 惯例不兼容,例如

  • 短/长标志。POSIX/GNU 标志有时会有短标志和长标志一对,如 -f/--force-n/--linesflag 没有这样的区别。
  • 组合短标志。在 POSIX/GNU 惯例中,-fd 表示 -f-dflag 将其解析为一个名为 fd 的单个标志。
  • 在参数后面的标志。POSIX/GNU 允许标志出现在位置参数之后,如 ./command arg1 --flag arg2,除非显式地通过 -- 分隔。 flag 将其解析为一系列连续的位置参数。

go-flag crate 设计目的是允许 Rust 程序员轻松地将使用 flag 编写的 Go CLI 程序移植,而不会破坏兼容性。

因此,我们的优先级如下

  1. 行为兼容性。它的目的是与 Go 内置的 flag 库在命令行行为上兼容。请注意,API 兼容性(相似性)是另一回事。
  2. 迁移。无法使用更复杂的解析器如 structopt 是痛苦的。因此,这个库提供了检查典型不兼容使用的功能,以允许逐步迁移。
  3. 简单性。这个库并不打算提供完整的解析器功能。例如,子命令解析不在此库的范围内。如果您想扩展程序以接受更复杂的标志,请尝试迁移到例如 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);
});

如果您需要一个文件路径列表,使用 PathBufOsString 允许使用非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