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

nightly zcfg

无额外功能库和通过命令行或文件进行二进制配置

2个不稳定版本

使用旧的Rust 2015

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

配置中排名第739


zcfg_flag_parser中使用

Apache-2.0

20KB
477

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();
}
  • 使您的任何类型都成为可配置的
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可以填充,而无需了解。

依赖项

~14KB