#flags #parse #argument #command-line #parser

zcfg_flag_parser

使用命令行标志将所有 zcfg 配置库填充到您的二进制文件中

2 个不稳定版本

使用旧的 Rust 2015

0.2.0 2017 年 12 月 1 日
0.1.0 2017 年 7 月 15 日

#836配置

Apache-2.0

26KB
610

zcfg

zcfg 是一个简单的配置库。它允许您在 Rust 库中定义可配置的值,而无需将您绑定到特定的解析格式,或需要在二进制文件中做额外处理。

与其他常见的配置或标志库不同,您不需要将应用程序的内部细节传播到 main,并且如果用户选择不这样做,您也不需要强制用户配置库的内部细节。

它受到了 gflags 和类似的全球配置系统的影响。

功能

  • 在相关位置直接定义配置值
#![feature(used)]
#[macro_use]
extern crate lazy_static;
#[macro_use]
extern crate zcfg;

define_pub_cfg!(net_protocol_timeout_ms, u32, 20000,
                "How long the server or client should wait before considering \
                this connection timed out.")
  • 在初始化域对象时访问这些值
struct NetProtocolClient {
  timeout_ms: u32,
}

impl Default for NetProtocolClient {
  fn default() -> NetProtocolClient {
    NetProtocolClient {
      timeout_ms: net_protocol_timeout_ms::CONFIG.get_value(),
    }
  }
}
  • 让二进制文件决定如何引入配置值
extern crate zcfg;
extern crate zcfg_flag_parser;

use zcfg_flag_parser::FlagParser;

fn main() {
  // Parse flags for all linked crates via command line
  FlagParser::new().parse_from_args(env::args().skip(1)).unwrap();
}
  • 使任何类型都变得 configurable
use zcfg::ConfigParsable;

enum BuildStrategy {
  Local,
  Remote {
    addr: String,
  }
}
impl ConfigParsable for BuildStrategy { ... }

define_cfg!(use_build_strategy, BuildStrategy, BuildStrategy::Local,
            "Defines how the build planner performs compilation. Options are \
             [Local] or [Remote(\"some_address\")].")

最佳实践

  • 将配置的访问限制在默认条件下的对象初始化中,以保持可测试性
  • 如果您希望其他模块使用配置,请考虑使用 define_pub_cfg
  • 确保默认值是有用的——用户可能根本不会进行配置填充。

路线图

  • 一个“帮助”功能,可以输出配置名称、默认值和配置描述,以供公众使用
  • 在稳定的版本上构建!zcfg 目前依赖于实验性的 used 功能,以防止配置初始化器被编译器丢弃。

工作原理

真正黑暗的东西。 zcfg 使用链接器标志和实验性的 used 功能的组合,将链接库中定义的所有标志放入全局列表中,这样 main 就可以填充,而无需了解。

依赖项

~480KB