文盘Rust -- 如何把配置文件打包到二进制文件里

打印 上一主题 下一主题

主题 909|帖子 909|积分 2727

​在实际开发中,经常会遇到各种不同的配置文件。通常,程序运行的各种配置从外部读取,以增强应用配置的灵活性。java 生态中的 springboot 提供了这种设计的典范。springboot 的应用程序,默认通过 application.yml 加载配置。默认的 application.yml 文件打进 jar 包,如果想改变程序的行为,可以在jar 包的同级目录下创建 application.yml 文件或者通过参数指定配置文件位置。那么在 rust 生态里有没有办法把默认配置文件打包到二进制文件呢。 我们可以通过 [rust-embed](https://github.com/pyrossh/rust-embed) 第三方库来实现这一效果。
在实际开发中的典型场景是: 不指定任何配置文件时,使用默认配置文件;当应用程序同级目录下包含配置文件时加载该配置文件。
* 定义嵌入文件的位置及获取函数
  src/resources/embed_resource.rs 中定义了嵌入文件的位置及获取函数
  1.   ```rust
  2.   use rust_embed::RustEmbed;
  3.   #[derive(RustEmbed)]
  4.   #[folder = "src/embedfiles/"]
  5.   struct Asset;
  6.   pub fn get_app_default() -> Option<rust_embed::EmbeddedFile> {
  7.     Asset::get("./app_default.yml")
  8.   }
  9.   ```
复制代码
  
宏定义了嵌入文件的目录 '#[folder = "src/embedfiles/"]',获取文件函数以该目录为根。* 使用嵌入文件
  1.  
复制代码
  1. ```rust
  2.   fn main() {
  3.     if Path::new("./app.yml").exists() {
  4.         let contents =
  5.             fs::read_to_string("./app.yml").expect("Read file error!");
  6.         println!("{}", contents);
  7.         return;
  8.     }
  9.     let app = get_app_default().unwrap();
  10.     let f = std::str::from_utf8(app.data.as_ref()).unwrap();
  11.     println!("{}", f);
  12.   }
  13.   ```
复制代码
  
按照优先级,我们先检查应用同级目录下有没有app.yml文件,如果有就加载,否则加载默认配置文件。我们先前定义的获取嵌入文件的函数会返回rust_embed::EmbeddedFile 的 struct。通过解析该 struct 的 data 成员,获取文件内容。* 测试
为了避免干扰,我们把编译好的应用 mv 到 /tmp 目录
  1.   ```shell
  2.   cargo build
  3.   mv target/debug/embed /tmp
  4.   ```
复制代码
 
先执行 embed ,可以看到,输出的是默认配置文件的内容;在应用程序同级目录建立 app.yml 文件,随便填写些内容,再执行 embed 则输出的是 app.yml 文件的内容。[源码地址](https://github.com/jiashiwen/wenpanrust/tree/main/embed)
以上示例在 macos 上编译执行通过,咱们下期见
作者:贾世闻

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表