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


    在实际开发中,经常会遇到各种不同的配置文件。通常,程序运行的各种配置从外部读取,以增强应用配置的灵活性。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 {
    7. Asset::get("./app_default.yml")
    8. }
    9. ```

    宏定义了嵌入文件的目录 '#[folder = "src/embedfiles/"]',获取文件函数以该目录为根。

    * 使用嵌入文件

    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 上编译执行通过,咱们下期见

    作者:贾世闻

  • 相关阅读:
    计算机视觉 基于CUDA编程的入门与实践
    设计模式——17. 状态模式
    Spring基础与核心概念
    Cy3.5-PEG-maleimide/马来酰亚胺,Cy3.5-聚乙二醇-马来酰亚胺,MAL-PEG-Cy3.5
    数据库信息速递: Oracle 23C 引入了向量搜索功能,为生成式人工智能应用提供支持 (译)...
    用户体验新尝试&思考|让“跳转”加速
    kafka安装
    FFmpeg 命令:从入门到精通 | ffplay 命令播放媒体
    软件工程复习笔记
    10年测试工程师 —— 手把手教会你做前端性能测试(超详细)
  • 原文地址:https://blog.csdn.net/jdcdev_/article/details/126828419