当前位置: 首页 > news >正文

Rust中三种方式使用环境变量

环境变量是存储在操作系统中的一组键值对。它们用于存储系统和其他应用程序所需的配置信息。本文我们将探索如何在Rust中使用标准库以及dotenv crate来处理环境变量。

环境变量

环境变量提供了一种灵活的方式来配置应用程序,而无需直接在源代码中硬编码配置值。这可以为不同的环境(开发、测试和生产)管理不同的配置,或让敏感信息(如API密钥)的安全变得更加容易。

让我们看3个不同的例子来说明如何在Rust中使用环境变量。

  1. 使用std::env模块
  2. 使用命令行(Windows和Linux)
  3. 使用dotenv crate

使用std::env模块

Rust提供了std::env模块来与环境变量交互。该模块可以读取、设置和删除环境变量。

首先,从标准库中导入env模块:

use std::env;
fn main(){let key: &str = "AAA";std::env::set_var(key, "123");match env::var(key){OK(val:String) => println!("():{:?}", key, val),Err(e: VarError) => println!("Error{}:{}", key, e),}
}

在终端中输入cargo run来测试程序,输出应该是这样的:

AAA:"123"
  • 设置删除变量

可以使用set_var函数设置环境变量,删除环境变量使用remove_var函数。下面是示例,我们将变量AAA设置为值123:

fn main() {let key = "AAA";std::env::set_var(key, "123"); // Sets AAA to 123
}fn main() {let key = "AAA";env::remove_var(key); // Removes the variable AAA
}
  • 检测变量存在

要检查环境变量是否存在,请使用env::var函数,该函数返回Result。你可以用match语句来处理:

fn main() {let key = "AAA";match env::var(key) {Ok(val) => println!("{}: {:?}", key, val),Err(e) => println!("Error {}: {}", key, e),}
}

使用命令行环境变量

你可以在运行Rust程序时直接从命令行传递环境变量。下面是如何读取CLI_ARG环境变量:

fn main() {let cli_arg = env::var("CLI_ARG");match cli_arg {Ok(val) => println!("CLI_ARG: {:?}", val),Err(e) => println!("Error CLI_ARG: {}", e),}
}

要从命令行读取它们,可以使用以下命令:

在Linux / macOS:

CLI_ARG=TEST cargo run

在Windows(powershell):

$env:CLI_ARG="TEST"; cargo run

使用dotenv Crate

除了标准库之外,您还可以使用dotenv crate从.env文件加载环境变量。这在开发环境中特别有用。首先将dotenv添加到Cargo.toml文件:

[dependencies]
dotenv = "0.15.0"

然后在项目根目录下创建.env文件:

API_KEY=1234567890
  • 从.env文件加载环境变量:
use dotenv::dotenv;
use std::env;fn main() {dotenv().ok(); // Reads the .env filelet api_key = env::var("API_KEY");match api_key {Ok(val) => println!("API_KEY: {:?}", val),Err(e) => println!("Error API_KEY: {}", e),}//Simulate the execution of the rest of the programprintln!("...program continues...");
}

在上面的例子中,dotenv().ok();行代码从项目根目录中的.env文件加载变量。然后,程序尝试读取API_KEY变量并打印其值,如果未设置则打印错误。

最后总结

这只是在Rust中使用环境变量的三个基本示例。希望让对你学习rust有点帮助,一起rust!

http://www.lryc.cn/news/476571.html

相关文章:

  • 搭建支持国密GmSSL的Nginx环境
  • Docker部署Portainer CE结合内网穿透实现容器的可视化管理与远程访问
  • 不适合的学习方法
  • 在子类中调用父类的构造函数
  • 【K8S系列】Kubernetes 中 Service 的流量不均匀问题【已解决】
  • C-小H学生物
  • 什么是软件设计模式, 它们⽤于解决什么问题, 它们为什么有效
  • LeetCode 3165.不包含相邻元素的子序列的最大和:单点修改的线段树(动态规划)
  • ios 快捷指令扩展(Intents Extension)简单使用 swift语言
  • 虚拟化环境中的精简版 Android 操作系统 Microdroid
  • NFTScan Site:以蓝标认证与高级项目管理功能赋能 NFT 项目
  • Vue:模板 MVVM
  • Kafka 消息丢失如何处理?
  • Mysql报错注入之floor报错详解
  • EPS原理笔记
  • LeetCode 876. 链表的中间结点
  • 划界与分类的艺术:支持向量机(SVM)的深度解析
  • 题目:100条经典C语言笔试题目(1-5)
  • python代码编写规范及注意事项
  • 【Linux】命令行参数 | 环境变量
  • python 使用进程池并发执行 SQL 语句
  • 我也谈AI
  • 算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
  • 编写第一个 Appium 测试脚本:从安装到运行!
  • mysql查表相关练习
  • airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告
  • Prometheus套装部署到K8S+Dashboard部署详解
  • python使用pymysql
  • Vue3 + TypeScript 组件和文件命名规范及 setup 导入顺序规范
  • netty之处理连接源码分析