Rust-使用dotenvy加載和使用環(huán)境變量的過程詳解
系統(tǒng)的開發(fā),測(cè)試和部署離不開環(huán)境變量,今天分享在Rust的系統(tǒng)開發(fā)中,使用dotenvy來讀取和使用環(huán)境變量。
安裝
cargo add dotenvy dotenv_codegen
加載環(huán)境變量
use dotenvy::dotenv; fn main() { dotenv().expect(".env不存在"); ... }
dotenvy默認(rèn)會(huì)從項(xiàng)目的根目錄下的.env文件中加載環(huán)境變量。
環(huán)境變量的使用
不僅可以在運(yùn)行時(shí)使用環(huán)境變量,還可以在編譯時(shí)使用環(huán)境變量。
運(yùn)行時(shí)使用環(huán)境變量
use std::env; use dotenvy::dotenv; fn main() { dotenv().expect(".env不存在"); //從.env中加載環(huán)境變量 println!("port={}", env::var("port").expect("port")); ... }
編譯時(shí)使用環(huán)境變量
#[macro_use] extern crate dotenv_codegen; static redis_url : &'static = dotenv!("redis_url"); fn main() { ... }
好了,從理論上,我們基本掌握了如何通過dotenvy,在Rust的代碼開發(fā)中,如何加載和使用環(huán)境變量。
下面,是在項(xiàng)目的實(shí)際應(yīng)用中,可能會(huì)有的疑問,我列了幾個(gè)供大家參考。
項(xiàng)目實(shí)戰(zhàn)相關(guān)問題
1. .env中的環(huán)境變量和系統(tǒng)中的環(huán)境變量是什么關(guān)系?
系統(tǒng)中的環(huán)境變量?jī)?yōu)先級(jí)大于.env中配置的環(huán)境變量。
例如,.env中有port=8000,而當(dāng)前系統(tǒng)的環(huán)境變量export port=8080,這個(gè)時(shí)候讀取到的環(huán)境變量port的值是8080
2. 在工程代碼中是否需要處理dotenv的錯(cuò)誤?
我的建議是,不需要。
這是少數(shù)幾個(gè)在Rust的編程開發(fā)中,我個(gè)人不建議處理錯(cuò)誤的地方,讓錯(cuò)誤以panic的方式終止系統(tǒng)運(yùn)行。如果當(dāng)前環(huán)境下不存在.env文件,系統(tǒng)應(yīng)該停止運(yùn)行,直至修復(fù)錯(cuò)誤。這里的原則是停下來什么都不做,總比運(yùn)行起來產(chǎn)生更大的錯(cuò)誤好。
3. 如果只是在編譯時(shí)使用環(huán)境變量,還需要在程序啟動(dòng)時(shí)調(diào)用dotenv()嗎?
不需要。
如果只是在編譯時(shí)使用環(huán)境變量,那么可以不用在程序啟動(dòng)時(shí)調(diào)用dotenv()函數(shù),但必須要正編譯時(shí).env文件存在。編譯完成后就可以丟棄.env文件了。
注意,另外,因?yàn)槭窃诰幾g時(shí)就將環(huán)境變量寫入了,所以,對(duì)環(huán)境變量的修改將不會(huì)對(duì)編譯后運(yùn)行的程序產(chǎn)生影響。
4. 應(yīng)該在運(yùn)行時(shí)使用環(huán)境變量,還是在編譯時(shí)使用環(huán)境變量?
如果環(huán)境變量不會(huì)在運(yùn)行時(shí)發(fā)生改變,且在編譯時(shí)就知道環(huán)境變量的值,那么推薦在編譯時(shí)使用環(huán)境變量。
在編譯時(shí)使用環(huán)境變量的幾個(gè)好處:
執(zhí)行cargo clippy或者cargo build,編譯器會(huì)幫你檢查你使用的環(huán)境變量名稱是否在.env文件中定義,如果不存在,編譯器會(huì)給出提示;
相較于通過std::env::var("port").expect("port"),直接使用dotenv!("port")可以不用關(guān)注如果port沒有定義時(shí)的處理分支。
5. 如何管理環(huán)境變量的相關(guān)代碼?
建議將環(huán)境變量放在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. 環(huán)境變量和config如何選擇?
哈哈,這個(gè)問題不好回答。
其實(shí)在config中,也支持環(huán)境變量的。它們?cè)诠δ苌隙加邢嗷ジ采w的地方。但是config支持類型的反序列化等豐富的功能。因此,環(huán)境變量和config如何選擇,這還是由項(xiàng)目的實(shí)際情況而定吧,不必太拘泥于技術(shù),畢竟技術(shù)是為我們服務(wù)的,而不是拿給我們站隊(duì)用的。
到此這篇關(guān)于Rust-使用dotenvy加載和使用環(huán)境變量的過程詳解的文章就介紹到這了,更多相關(guān)Rust使用dotenvy加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!