allan2 / dotenvy

A well-maintained fork of the Rust dotenv crate
MIT License
625 stars 39 forks source link

The dotenv! macro looks for the .env in the workspace root dir instead of crate root dir #74

Open stevepryde opened 1 year ago

stevepryde commented 1 year ago

I commonly work in a workspace with multiple binary crates that each have their own .env file. However it seems the dotenv!() macro is looking for the .env file in the workspace root instead of the crate root dir.

Any idea why this would be happening?

allan2 commented 1 year ago

Hi Steve,

I was able to reproduce your problem. allan2/dotenvy-workspace-example

The issue is that dotenvy::dotenv and the dotenvy! macro both start finding from std::env::current_dir. If the user runs from the workspace root, then the current dir is the workspace root. So your crate .env would only get picked up if you run from the crate root.

One solution is to use CARGO_MANIFEST_DIR to get the crate root.

let manifest_dir = std::env::var("CARGO_MANIFEST_DIR")?;
dotenvy::from_path(format!("{manifest_dir}/.env"))?;
std::env::var("FOO")?;

Of course, this loads at runtime instead of compile time. Let me know if that is acceptable for you.

stevepryde commented 1 year ago

I was hoping to use the dotenv!() macro to have the best of both worlds between env!() and having a .env file and I don't think this solution works for that. Any chance of a toml file or some way to provide the path at compile time?

85oskxr commented 12 months ago

Has anyone found a reasonable solution to this problem? In my case the .env file needs to be in the parent directory as other language projects will use it.

cbeck88 commented 10 months ago

(misread question)