在理论开发中,常常会遇到各种不同的配置文件。通常,程序运行的各种配置从内部读取,以加强利用配置的灵活性。java 生态中的 springboot 提供了这种设计的榜样。springboot 的应用程序,默认通过 application.yml 加载配置。默认的 application.yml 文件打进 jar 包,如果想改变程序的行为,能够在 jar 包的同级目录下创立 application.yml 文件或者通过参数指定配置文件地位。那么在 rust 生态里有没有方法把默认配置文件打包到二进制文件呢。
咱们能够通过 rust-embed 第三方库来实现这一成果。
在理论开发中的典型场景是: 不指定任何配置文件时,应用默认配置文件;当应用程序同级目录下蕴含配置文件时加载该配置文件。
- 定义嵌入文件的地位及获取函数
src/resources/embed_resource.rs 中定义了嵌入文件的地位及获取函数
`
rust
use rust_embed::RustEmbed;
#[derive(RustEmbed)]
#[folder = “src/embedfiles/”]
struct Asset;
pub fn get_app_default() -> Option<rust_embed::EmbeddedFile> {
Asset::get(“./app_default.yml”)
}
`
宏定义了嵌入文件的目录 ‘#[folder = “src/embedfiles/”]’, 获取文件函数以该目录为根。
- 应用嵌入文件
`
rust
fn main() {
if Path::new(“./app.yml”).exists() {
let contents =
fs::read_to_string(“./app.yml”).expect(“Read file error!”);
println!(“{}”, contents);
return;
}
let app = get_app_default().unwrap();
let f = std::str::from_utf8(app.data.as_ref()).unwrap();
println!(“{}”, f);
}
`
依照优先级,咱们先查看利用同级目录下有没有 app.yml 文件,如果有就加载,否则加载默认配置文件。咱们先前定义的获取嵌入文件的函数会返回 rust_embed::EmbeddedFile 的 struct。通过解析该 struct 的 data 成员,获取文件内容。
- 测试
为了防止烦扰,咱们把编译好的利用 mv 到 /tmp 目录
`
shell
cargo build
mv target/debug/embed /tmp
`
先执行 embed,能够看到,输入的是默认配置文件的内容;在应用程序同级目录建设 app.yml 文件,轻易填写些内容,再执行 embed 则输入的是 app.yml 文件的内容。
源码地址
以上示例在 macos 上编译执行通过,咱们下期见
作者:贾世闻