• Rust-使用dotenvy加载和使用环境变量


    系统的开发,测试和部署离不开环境变量,今天分享在Rust的系统开发中,使用dotenvy来读取和使用环境变量。

    安装

    cargo add dotenvy dotenv_codegen

    加载环境变量

    1. use dotenvy::dotenv;
    2. fn main() {
    3. dotenv().expect(".env不存在");
    4. ...
    5. }

    dotenvy默认会从项目的根目录下的.env文件中加载环境变量。

    环境变量的使用

    不仅可以在运行时使用环境变量,还可以在编译时使用环境变量。

    运行时使用环境变量

    1. use std::env;
    2. use dotenvy::dotenv;
    3. fn main() {
    4. dotenv().expect(".env不存在"); //从.env中加载环境变量
    5. println!("port={}", env::var("port").expect("port"));
    6. ...
    7. }

    编译时使用环境变量

    1. #[macro_use]
    2. extern crate dotenv_codegen;
    3. static redis_url : &'static = dotenv!("redis_url");
    4. fn main() {
    5. ...
    6. }

    好了,从理论上,我们基本掌握了如何通过dotenvy,在Rust的代码开发中,如何加载和使用环境变量。

    下面,是在项目的实际应用中,可能会有的疑问,我列了几个供大家参考。

    项目实战相关问题

    1. .env中的环境变量和系统中的环境变量是什么关系?

    系统中的环境变量优先级大于.env中配置的环境变量。

    例如,.env中有port=8000,而当前系统的环境变量export port=8080,这个时候读取到的环境变量port的值是8080

    2. 在工程代码中是否需要处理dotenv的错误? 

    我的建议是,不需要。

    这是少数几个在Rust的编程开发中,我个人不建议处理错误的地方,让错误以panic的方式终止系统运行。如果当前环境下不存在.env文件,系统应该停止运行,直至修复错误。这里的原则是停下来什么都不做,总比运行起来产生更大的错误好。

    3. 如果只是在编译时使用环境变量,还需要在程序启动时调用dotenv()吗?

    不需要。

    如果只是在编译时使用环境变量,那么可以不用在程序启动时调用dotenv()函数,但必须要正编译时.env文件存在。编译完成后就可以丢弃.env文件了。

    注意,另外,因为是在编译时就将环境变量写入了,所以,对环境变量的修改将不会对编译后运行的程序产生影响。

    4. 应该在运行时使用环境变量,还是在编译时使用环境变量?

    如果环境变量不会在运行时发生改变,且在编译时就知道环境变量的值,那么推荐在编译时使用环境变量。

    在编译时使用环境变量的几个好处:

    • 执行cargo clippy或者cargo build,编译器会帮你检查你使用的环境变量名称是否在.env文件中定义,如果不存在,编译器会给出提示;

    • 相较于通过std::env::var("port").expect("port"),直接使用dotenv!("port")可以不用关注如果port没有定义时的处理分支。

    5. 如何管理环境变量的相关代码?

    建议将环境变量放在env.rs文件中。

    main.rs

    1. #[macro_use]
    2. extern crate dotenv_codegen;
    3. mod env;
    4. use env::PORT;
    5. fn main() {
    6. println!("port={}", PORT);
    7. }

    env.rs

    pub static PORT: &str = dotenv!("port");

    6. 环境变量和config如何选择?

    哈哈,这个问题不好回答。

    之前写了一篇Rust-使用config配置你的API - 知乎

    其实在config中,也支持环境变量的。它们在功能上都有相互覆盖的地方。但是config支持类型的反序列化等丰富的功能。因此,环境变量和config如何选择,这还是由项目的实际情况而定吧,不必太拘泥于技术,毕竟技术是为我们服务的,而不是拿给我们站队用的。

    如果大家还有什么疑问,欢迎留言交流。

    这篇文章收录我的Rust-项目开发实战Rust 实战专栏。请关注我,不要错过更新哟。

  • 相关阅读:
    01【C语言 & 趣味算法】百钱百鸡问题(问题简单,非初学者请忽略叭)。请注意算法的设计(程序的框架),程序流程图的绘制,算法的优化。
    图扑软件荣获第七届“创客中国”中小企业创新创业大赛优胜奖!
    jenkins自动化部署安装
    01. 板载硬件资源和开发环境
    C语言自定义类型:结构体
    【无标题】
    Hive基本使用
    基于SSM的设备配件管理和设备检修系统
    如何建设一个安全运营中心(SOC)?
    【模型部署 01】C++实现GoogLeNet在OpenCV DNN、ONNXRuntime、TensorRT、OpenVINO上的推理部署
  • 原文地址:https://blog.csdn.net/firefox1/article/details/134372569