🦀
【Rust】.env で環境変数を設定する
概要
dotenvy を使用して .env ファイルで環境変数を設定します。
環境
- rustc: 1.76.0 (07dca489a 2024-02-04)
- cargo: 1.76.0 (c84b36747 2024-01-18)
- dioxus-cli: 0.5.1
- dotenvy: 0.15.7
参考にしたサイト
基本的な使い方
-
プロジェクトに
dotenvy
を追加します。cargo add dotenvy
-
.env
フィアルを作成します。touch .env
-
.env
ファイルに環境変数APP_
を追加します。.envAPP_VERSION=1.0.0 APP_PROD=false
-
main 関数で環境変数を読み込みます。
src/main.rsuse dotenvy::dotenv; use std::env; fn main() { // load environment variables from .env file dotenv().expect(".env file not found"); for (key, value) in env::vars() { if key.starts_with("APP_") { println!("{key}: {value}"); } } }
-
プロジェクトを実行すると環境変数が出力されます。
APP_VERSION: 1.0.0 APP_PROD: false
環境毎に .env ファイルを切り替える
-
Production 用の .env_prod ファイルを作成します。
touch .env_prod
-
.env_prod
ファイルに環境変数APP_
を追加します。.envAPP_VERSION=1.0.0 APP_PROD=true
-
main 関数で環境毎に環境変数を読み込みます。
src/main.rsuse dotenvy::from_filename; use std::env; fn get_env_file_name() -> String { match cfg!(debug_assertions) { true => ".env".to_string(), false => ".env_prod".to_string(), } } fn main() { let env_file = get_env_file_name(); from_filename(env_file).expect(".env file not found"); for (key, value) in env::vars() { if key.starts_with("APP_") { println!("{key}: {value}"); } } }
-
プロジェクトを release でビルドし実行します。
APP_VERSION: 1.0.0 APP_PROD: true
WebAssembly で .env ファイルから環境変数を設定する
WebAssembly はコンパイル時に環境変数を渡す必要があります。
そのため ビルドスクリプト を利用して、ビルド時に .env ファイルから環境変数を読み取り、後で読み取ることができる env.rs ファイルを生成します。
-
build-dependencies
に dotenvy を追加します。Cargo.toml[build-dependencies] dotenvy = "0.15.7"
-
ビルドスクリプトで実行する build.rs を作成します。
build.rs// see https://dev.to/javiasilis/how-to-pass-environment-variables-to-a-rust-wasm-application-like-yew-dioxus-and-leptos-as-a-typescript-developer-ond use dotenvy::dotenv; use std::env; use std::fs::File; use std::io::Write; fn main() { println!("cargo:rerun-if-changed=.env"); let dest_path = "./src/env.rs"; let mut f = File::create(&dest_path).unwrap(); // use the dotenv crate to get the .env values dotenv().ok(); f.write_all(b"// This file is automatically generated by build.rs\n\n") .unwrap(); for (key, value) in env::vars() { if key.starts_with("APP_") { let line = format!( "pub const {}: &'static str = \"{}\";\n", key, value.replace("\"", "\\\"") ); f.write_all(line.as_bytes()).unwrap(); } } }
-
プロジェクトをビルドして env.rs ファイルを生成します。
src/env.rspub const APP_VERSION: &'static str = "1.0.0"; pub const APP_PROD: &'static str = "false";
-
main 関数で env を利用します。
src/main.rsmod env; fn main() { println!("{}", env::APP_VERSION); println!("{}", env::APP_PROD); }
Discussion
( 本筋に関係ないですが )
typo
「基本的な使い方」> 2.