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-项目开发实战和Rust 实战专栏。请关注我,不要错过更新哟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/141771.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

公司让我开发一个管理系统,有了它,So easy!

目录 一、前言 二、低代码如何快速开发? 1.可视化开发 2.预构建的组件和模板 3.集成的开发和测试工具 4.跨平台兼容性 5.可伸缩性和可扩展性 三、前后端分离的开发框架 技术架构 一、前言 长期以来,常规软件开发是一项艰苦而详尽的工作。开发人员编写代表…

设计模式之适配器(Adapter)

Adapter Wapper 接口转换器 如果一个类不能直接访问另一个类的时候,中间加一个Adapter转换器就能访问了 常见例子: 电压转接头 java.io jdbc-odbc bridge(不是桥接模式) ASM Transformer java io里面的读文件操作: FileInputStream是字节流读文件,就像…

多线程JUC

创建线程的三种方法 runnable还需要通过currentthread来获取当前方法,才能使用Thread中的方法 第三种实现方法过程: 1.创建一个类MyCallable实现Callable接口 2.重写call (是有返回值的,表示多线程运行的结果) 3.创建MyCallable的对象 (表示多…

LLaMA模型之中文词表的蜕变

在目前的开源模型中,LLaMA模型无疑是一颗闪亮的⭐️,但是相对于ChatGLM、BaiChuan等国产大模型,其对于中文的支持能力不是很理想。原版LLaMA模型的词表大小是32K,中文所占token是几百个左右,这将会导致中文的编解码效率…

全国各区县平均降水月数据!多时间版本可查询

本周给大家推荐一些环境监测数据~ 今天分享的是全国平均降水数据~ 全国平均降水是指全国各个地区降水的平均值。这个值是通过收集和统计全国各地的降雨和降雪数据得出的。由于各地的气候条件和地形不同,因此全国平均降水并不是简单的平均数,而是根据各…

设计模式之原型模式(Prototype)

原型模式 如果已经有一个对象了,你想创建一个对象,而且对象里面的属性和已经存在的对象的属性差不多,就可以使用clone方法 克隆一个出来 实现原型模式需要实现标记型接口Cloneable -->标记型接口 : 里面没有需要实现的方法(空接口) 一般…

SQL学习之增删改查

文章目录 数据库数据类型建表create table插入数据insert into查询数据select from修改数据update set删除数据delete from备份ctas结果插入iis截断表 truncate table修改表结构alter table添加注释 注:本文的SQL语法是基于Oracle数据库操作的,但是基本的…

猫罐头如何选择?最受欢迎的5款猫罐头推荐!新手养猫速看!

对于一个刚入门的养猫新手来说,面对市面上琳琅满目的猫罐头选择确实让人头大。我们总想选到营养价值高的罐头,但又怕猫咪不喜欢吃,还担心选到不安全的产品。 作为家里有5只猫猫的铲屎官来说,养猫的这几年可以说是血泪史了&#x…

保姆级vue-pdf的使用过程

第一步 引入vue-pdf npm install --save vue-pdf 第二步 按照需求我们慢慢进行 01.给你一个pdf文件的url&#xff0c;需要在页面渲染 代码 <template><div><pdfref"pdf":src"url"></pdf></div> </template> <…

scDrug:从scRNA-seq到药物反应预测

scRNA-seq技术允许在转录组水平上对数千个细胞进行测量。scRNA-seq正在成为研究肿瘤微环境中细胞成分及其相互作用的重要工具。scRNA-seq也被用于揭示肿瘤微环境模式与临床结果之间的关联&#xff0c;并在复杂组织中剖析药物治疗的细胞特异性效应。scRNA-seq的最新进展推动了疾…

postswigger 靶场(CSRF)攻略-- 3.令牌验证

靶场地址&#xff1a; https://portswigger.net/web-security/csrf 令牌(token) 验证取决于令牌(token) 的存在 题目中已告知易受攻击的是电子邮件的更改功能&#xff0c;而目标是利用 csrf 漏洞更改受害者的电子邮件地址&#xff0c;最后给出了登录凭据&#xff1a;wiener:pet…

SaaS 电商设计 (三) 如何做大促压测

一.背景&目标 1.1 常见的压测场景 电商大促:一众各大厂的促销活动场景,如:淘宝率先推出的天猫双11,而后京东拉出的京东 618 .还是后续陆陆续续的一些年货节, 3.8 女神节等等.都属于一些常规的电商大促 票务抢购:常见的如承载咱们 80,90 青春回忆的 Jay 的演唱会,还有普罗…

LLM 大模型向量数据库技术架构浅析

▼最近直播超级多&#xff0c;预约保你有收获 近期直播&#xff1a;《LLM 大模型向量数据库技术架构剖析和应用案例实战》 —1— AI 智能时代&#xff0c;开发者需要一个真正的向量数据库吗&#xff1f; 答案很简单&#xff0c;这取决于开发者的应用场景。举个例子&#xff0c;…

内网穿透的应用-如何使用CFImagehost搭建简洁易用的私人图床并公网访问

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

pdf增强插件 Enfocus PitStop Pro 2022 mac中文版功能介绍

Enfocus PitStop Pro mac是一款 Acrobat 插件&#xff0c;主要用于 PDF 预检和编辑。这个软件可以帮助用户检查和修复 PDF 文件中的错误&#xff0c;例如字体问题、颜色设置、图像分辨率等。同时&#xff0c;Enfocus PitStop Pro 还提供了丰富的编辑工具&#xff0c;可以让用户…

响应式工作范文作文学习参考资料网站模板源码

模板信息&#xff1a; 模板编号&#xff1a;29083 模板编码&#xff1a;UTF8 模板分类&#xff1a;博客、文章、资讯、其他 适合行业&#xff1a;工作范文类企业 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0c;原创设计、手工书写DIVC…

docker小技能

文章目录 I 预备知识Docker组成命名空间 (进程隔离)II 常用命令2.1 案例:流水线docker 部署2.2 删除没有使用的镜像2.3 shell 不打印错误输出2.4 阿里云流水线/jenkins忽略shell步骤中的报错https://www.runoob.com/docker/docker-architecture.html I 预备知识 Docker组成…

【vue】0到1的常规vue3项目起步

创建项目并整理目录 npm init vuelatestjsconfig.json配置别名路径 配置别名路径可以在写代码时联想提示路径 {"compilerOptions" : {"baseUrl" : "./","paths" : {"/*":["src/*"]}} }elementPlus引入 1. 安装e…

openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程

文章目录 openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程122.1 创建并执行涉及加密列的函数/存储过程 openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程 密态支持函数/存储过程当前版本只支持sql和P…

【工程实践】Docker使用记录

前言 服务上线经常需要将服务搬到指定的服务器上&#xff0c;经常需要用到docker&#xff0c;记录工作中使用过dcoker指令。 1.写Dockerfile 1.1 全新镜像 FROM nvidia/cuda:11.7.1-devel-ubuntu22.04ENV WORKDIR/data/Qwen-14B-Chat WORKDIR $WORKDIR ADD . $WORKDIR/RUN ap…