Rust Environment Variables without dotenv

I would like to load a set of Rust environment variables depending on my build environment (in my case, dev, uat and live). Ideally, I would like to specify the environment file ay build time.

Looking at online docs, the advice seems to be to use the dotenv crate. However, that crate is a v0 version, and does not appear to be maintained. Is there an idiomatic way to do this without using an old library?

2

1 Answer

Without external libraries you can use cargo configuration env property and have something like:

Options A: Single configuration

  • my-project/.cargo/config.toml
[env]
MY_ENV="dev"
MY_DEV_HOST="localhost"
MY_PROD_HOST="prod.example.com"
  • my-project/src/main.rs
fn main() -> Result<(), Box<dyn Error>> { let my_env = env::var("MY_ENV") .unwrap_or("dev".to_string()) .to_uppercase(); let my_host = env::var(format!("MY_{}_HOST", my_env))?; // Do something Ok(())
}

then you run it with cargo run and it will take the default dev values, with MY_ENV="prod" cargo run will take prod values.

Option B: Multiple configuration

Another options if is a configuration per environment and use --config cargo command line option, for example:

  • my-project/stg-config.toml
[env]
MY_ENV="stg"
MY_HOST="stg.example.com"
  • my-project/prod-config.toml
[env]
MY_ENV="prod"
MY_HOST="prod.example.com"

and then cargo run --config stg-config.toml, if you have .cargo/config.toml (with default env values) it will merge those.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like