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?
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.