Rust-使用dotenvy加载和使用环境变量的过程详解

 更新时间:2023年11月14日 12:13:55   作者:明天好,会的  
系统的开发,测试和部署离不开环境变量,今天分享在Rust的系统开发中,使用dotenvy来读取和使用环境变量,感兴趣的朋友跟随小编一起看看吧

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

安装

cargo add dotenvy dotenv_codegen

加载环境变量

use dotenvy::dotenv;
fn main() {
    dotenv().expect(".env不存在");
    ...
}

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

环境变量的使用

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

运行时使用环境变量

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

编译时使用环境变量

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

好了,从理论上,我们基本掌握了如何通过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

#[macro_use]
extern crate dotenv_codegen;
mod env;
use env::PORT;
fn main() {
    println!("port={}", PORT);
}

env.rs

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

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

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

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

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

到此这篇关于Rust-使用dotenvy加载和使用环境变量的过程详解的文章就介绍到这了,更多相关Rust使用dotenvy加载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入了解Rust的生命周期

    深入了解Rust的生命周期

    生命周期指的是引用保持有效的作用域,Rust 的每个引用都有自己的生命周期。本文将通过示例和大家详细说说Rust的生命周期,需要的可以参考一下
    2022-11-11
  • rust类型转换的实现

    rust类型转换的实现

    Rust是类型安全的语言,因此在Rust中做类型转换不是一件简单的事,本文主要介绍了rust类型转换的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Rust 语言中的dyn 关键字及用途解析

    Rust 语言中的dyn 关键字及用途解析

    在Rust中,"dyn"关键字用于表示动态分发(dynamic dispatch),它通常与trait对象一起使用,以实现运行时多态, 在Rust中,多态是通过trait和impl来实现的,这篇文章主要介绍了Rust 语言中的 dyn 关键字,需要的朋友可以参考下
    2024-03-03
  • 一文弄懂Rust之切片

    一文弄懂Rust之切片

    在Rust中,切片是一种非常重要的引用类型,它允许你安全地引用一段连续内存中的数据,而不需要拥有这些数据的所有权,本文主要介绍了Rust之切片,感兴趣的可以了解一下
    2024-03-03
  • Rust的泛型、Traits与生命周期用法及说明

    Rust的泛型、Traits与生命周期用法及说明

    本文通过一个寻找列表中最大值的示例,展示了如何从重复代码中提取函数,再利用泛型实现代码复用,主要步骤包括:识别重复逻辑;抽象提取;泛型应用;进一步扩展,通过不断抽象和泛化,我们不仅能减少代码重复,还能写出更通用、健壮和可维护的代码
    2025-02-02
  • Rust中的引用循环与内存泄漏详解

    Rust中的引用循环与内存泄漏详解

    这篇文章主要介绍了在Rust中如何使用Rc和RefCell来创建引用循环,以及引用循环可能导致的内存泄漏问题,文章还讨论了如何使用Weak类型来解决引用循环问题,特别是在需要双向引用的场景中,如树形结构,通过理解和掌握这些智能指针的使用,可以编写更高效且内存安全的Rust程序
    2025-02-02
  • Rust Option类型基本使用详解

    Rust Option类型基本使用详解

    Rust的Option是一种强大的类型,用于处理可能为空的情况,避免了许多空值引起的运行时错误,本文介绍Rust Option类型详解,感兴趣的朋友一起看看吧
    2024-02-02
  • 详解Rust Substrate框架中的Runtime

    详解Rust Substrate框架中的Runtime

    ubstrate是一个区块链开发框架,它提供了一系列模块化和可扩展的组件,可以帮助开发人员快速构建自定义区块链。 Runtime是Substrate区块链的核心部分,文中有详细的代码示例,需要的朋友可以参考下
    2023-05-05
  • 关于rust的模块引入问题

    关于rust的模块引入问题

    Rust 语言是一种高效、可靠的通用高级语言,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言,这篇文章主要介绍了rust的模块引入相关知识,需要的朋友可以参考下
    2022-10-10
  • 聊聊Rust 运算符

    聊聊Rust 运算符

    运算符 用于对数据执行一些操作。被运算符执行操作的数据我们称之为操作数。下面通过本文给大家介绍Rust 运算符的相关知识,感兴趣的朋友一起看看吧
    2021-11-11

最新评论