🦀

【Rust】.env で環境変数を設定する

2024/04/24に公開1

概要

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

参考にしたサイト

基本的な使い方

  1. プロジェクトに dotenvy を追加します。

    cargo add dotenvy
    
  2. .env フィアルを作成します。

    touch .env
    
  3. .env ファイルに環境変数 APP_ を追加します。

    .env
    APP_VERSION=1.0.0
    APP_PROD=false
    
  4. main 関数で環境変数を読み込みます。

    src/main.rs
    use 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}");
            }
        }
    }
    
  5. プロジェクトを実行すると環境変数が出力されます。

    APP_VERSION: 1.0.0
    APP_PROD: false
    

環境毎に .env ファイルを切り替える

  1. Production 用の .env_prod ファイルを作成します。

    touch .env_prod
    
  2. .env_prod ファイルに環境変数 APP_ を追加します。

    .env
    APP_VERSION=1.0.0
    APP_PROD=true
    
  3. main 関数で環境毎に環境変数を読み込みます。

    src/main.rs
    use 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}");
            }
        }
    }
    
  4. プロジェクトを release でビルドし実行します。

    APP_VERSION: 1.0.0
    APP_PROD: true
    

WebAssembly で .env ファイルから環境変数を設定する

WebAssembly はコンパイル時に環境変数を渡す必要があります。
そのため ビルドスクリプト を利用して、ビルド時に .env ファイルから環境変数を読み取り、後で読み取ることができる env.rs ファイルを生成します。

  1. build-dependencies に dotenvy を追加します。

    Cargo.toml
    [build-dependencies]
    dotenvy = "0.15.7"
    
  2. ビルドスクリプトで実行する 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();
            }
        }
    }
    
  3. プロジェクトをビルドして env.rs ファイルを生成します。

    src/env.rs
    pub const APP_VERSION: &'static str = "1.0.0";
    pub const APP_PROD: &'static str = "false";
    
  4. main 関数で env を利用します。

    src/main.rs
    mod env;
    
    fn main() {
        println!("{}", env::APP_VERSION);
        println!("{}", env::APP_PROD);
    }
    

Discussion

kanaruskanarus

( 本筋に関係ないですが )

typo

「基本的な使い方」> 2.

.env フィアル