9个版本
0.1.10 | 2020年1月19日 |
---|---|
0.1.9 | 2020年1月18日 |
#350 in 配置
52KB
1K SLoC
viperus
̶g̶o̶ rust配置,带尖牙!
viperus是Rust应用程序的一个(不完整)配置解决方案,深受优秀的go包https://github.com/spf13/viper的启发。使用时请自担风险。;-)
没有使用Viperus构建的Go项目已被破坏:-)
近期更改
- 0.1.10适配器从std:io::Read加载cfg数据
- 0.1.9可选自动前缀环境变量映射,基本错误传播,清理依赖
- 0.1.8添加缓存功能,模块化"特性化"
- 0.1.5添加watch_all文件并自动重新加载
- 0.1.4添加格式:java属性文件
- 0.1.3更好的Clap参数:默认值
- 0.1.2从文件重新加载配置
- 0.1.1修复dcs
- 0.1.0第一个版本
什么是Viperus?
一个处理不同格式、cli参数和环境的配置模式的包。它支持
- 设置默认值
- 从JSON、TOML、YAML、dotenv文件、java属性配置文件中读取
- 从环境变量中读取
- 从Clap命令行标志中读取
- 设置明确的值
- 重新加载所有文件
- 监视配置文件,并在发生变化时重新加载所有内容
- 缓存
为什么选择Viperus?
因为我正在迁移一些Go应用程序...并且缺少Viper的易用性:-)
Viperus使用以下递减优先级顺序。
- 显式调用
add
- Clap标志
- 配置
- 环境变量
- 默认值
Viperus将toml、dotenv、json、yaml文件和Clap选项合并为单个类型化的哈希结构,具有默认值和类型检查。
您可以创建一个独立的 Viperus 对象,或者通过 shadow 函数 load_file|get|add|load_clap 来“使用”全局实例(线程安全,由互斥锁保护),这些函数都会路由到静态实例。
//add a dotenv config file , keys defautls di env variables
viperus::load_file(".env", viperus::Format::ENV).unwrap();
//add another file
viperus::load_file("user.env", viperus::Format::ENV).unwrap();
//automatically map env variable staring with "TEST_" to config keys
viperus::set_env_prefix("TEST_");
viperus::automatic_env(true);
//watch the config and autoreload if something changes
viperus::watch_all();
//enable caching -- file reload invalidates cache
// cache i thread safe for the global "static" instance
viperus::cache(true);
let ok=viperus::get::<bool>("TEST_BOOL").unwrap();
顺便说一下,是的,我知道全局变量是邪恶的。但受到 go 包 viper 的启发,如果您不喜欢全局变量,可以在 cargo.toml 中禁用“global”功能来选择退出。
缓存
您可以通过启用缓存来实现 x4 的速度提升。当与位于 arc 互斥锁之后的全局实例一起使用时,缓存是线程安全的。
viperus::cache(true);
使用显式的 viperus::reload()
重新加载文件,或者当文件监视器活动时,文件更改的效果会使缓存无效。
日志/调试
该包使用 log
面具,并通过测试 env_logger
,您可以将环境变量设置为 RUST_LOG=viperus=[DEBUG LEVEL],其中 [DEBUG LEVEL] = info|warning|debug 或 RUST_LOG=[DEBUG LEVEL]。
功能
该包默认启用了“featurized”功能
- 功能 = "fmt-[格式]",其中 [格式] 在 'json,end,toml,yaml,javaproperties,clap' 中启用相应的格式
- 功能 = "global",启用全局线程安全配置
- 功能 = "watch",启用自动文件重新加载,前提是特征 = global
- 功能 = "cache",启用缓存
可以通过 cargo.toml 以选择性的方式激活单个功能
[dependencies.viperus]
version = "0.1.8"
# do not include the default features, and optionally
default-features = false
# cherry-pick individual features
features = ["global", "cache","watch","fmt-yaml"]
示例
您可以在测试目录中找到一些集成测试,也可以在示例目录中运行示例(使用 cargo)
cargo run --example cli-clap-yaml --
cargo run --example cli-clap-yaml -- -u http://nowhere/api/v1
第一次运行将打印 example.yaml 文件中的值,第二次将打印 CLI 参数中的值
let matches = App::new("My Super Program")
.arg(Arg::with_name("v")
.short("v")
.multiple(true)
.help("Sets the level of verbosity"))
.get_matches();
let mut v = Viperus::new();
//enable clap
v.load_clap(matches);
//enable a yaml json toml file
v.load_file(&path!(".","assets","test.yaml"), Format::YAML).unwrap();
v.load_file(&path!(".","assets","test.json"), Format::JSON).unwrap();
v.load_file(&path!(".","assets","test.toml"), Format::TOML).unwrap();
v.load_file(&path!(".","assets","test.properties"), Format::JAVAPROPERTIES).unwrap();
//link the "v" clap option to the key "verbose"
v.bond_clap("v","verbose");
//add an explicit overload
v.add("service.url", String::from("http://example.com"));
debug!("final {:?}", v);
//get a typed key
let s: &str = v.get("service.url").unwrap();
assert_eq!("http://example.com", s);
//get a bool from configs or app args
let fVerbose=v.get::<bool>("verbose").unwrap();
assert_eq!(true, fVerbose);
待办事项
- 远程配置
- 更好的错误传播
- 稳定 API
- 改进文档和示例
- 提高我的 Rust Karma
依赖关系
~0.4–9.5MB
~81K SLoC