#json-toml #env-var #yaml #toml #config-file #json #dotenv

viperus

Viperus是一个为Rust应用程序提供的(不完整)配置解决方案,它深受GO包Viper的启发。它支持从JSON、TOML、YAML、envfile、java属性中读取默认值,从Clap命令行标志中读取环境变量,并设置明确的值。

9个版本

0.1.10 2020年1月19日
0.1.9 2020年1月18日

#350 in 配置


the-media-organizer使用

MIT/Apache

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