Packages
env_loader
0.1.0
A lightweight, dependency-free Elixir library for loading .env files into the system environment. Built for simplicity and robustness, it handles edge cases like comments, quoted values, EXPORT directives, empty keys, and inline comments with fewer than 60 lines of code.
Current section
Files
Jump to
Current section
Files
env_loader
README.md
README.md
# EnvLoader
[](https://github.com/Eygem/env_loader/blob/main/LICENSE)
[](https://github.com/Eygem/env_loader/actions)
A lightweight, dependency-free Elixir library for loading `.env` files into the system environment. Built for simplicity and robustness, it handles edge cases like comments, quoted values, `EXPORT` directives, empty keys, and inline comments with fewer than 60 lines of code.
## Installation
Add `env_loader` to your `mix.exs` dependencies:
```elixir
{:env_loader, "~> 0.1"}
```
Run mix deps.get to fetch the dependency.
## Usage
`EnvLoader` loads environment variables from `.env` files into the system environment, typically in `config/runtime.exs`. This example loads variables from different files for production and development/testing environments. Variables can then be accessed via `System.get_env/1` or application config.
Add the following to `config/runtime.exs`:
```elixir
import Config
require Logger
env_file = if config_env() == :prod, do: "./envs/.env", else: "./envs/.env.dev"
case EnvLoader.load(env_file) do
:ok -> Logger.info("Successfully loaded .env file #{env_file}")
:error -> Logger.error("Failed to load .env file #{env_file}")
end
# Optional: Set application-specific config
config :your_app, encryption_key: System.get_env("ENCRYPTION_KEY") || "default_key"
```
Access loaded variables in your application:
```elixir
# Using System.get_env/1
key = System.get_env("ENCRYPTION_KEY")
# Using application config (if defined)
key = Application.get_env(:your_app, :encryption_key)
```
### Why Use `config/runtime.exs`?
Elixir’s `config/runtime.exs` is evaluated at runtime, just before the application starts, making it ideal for loading environment variables because:
- **Early Execution**: Runs before the supervision tree, ensuring variables are available to all processes.
- **No Compile-Time Dependency**: Unlike `config/config.exs`, it doesn’t require variables during compilation.
- **Idiomatic Elixir**: Integrates with the `Config` module for setting application configs (e.g., `config :your_app, ...`).
## Supported .env Formats
`EnvLoader` handles the following edge cases:
- Quotes (`'value'`, `"value"`)
- `EXPORT` directives (`EXPORT key=value`, `export key=value`)
- Empty lines
- Empty keys and values (`EMPTY_KEY=`, `=value`)
- Full-line comments (`#comment`)
- Inline comments (`key=value #comment`)
- Malformed lines (`MALFORMED`)
- Multiple `=` (`KEY=abc=def`)
- Whitespace (` KEY = value `)
- Whitespace in values (`key=value with spaces`)
Example `.env` file:
```shell
# Comment
ENCRYPTION_KEY='secret123'
API_KEY="key with spaces"
EMPTY_KEY=
=value
MALFORMED
KEY_WITH_EQUALS=abc=def
EXPORT EXPORT1_KEY="export1"
export EXPORT2_KEY="export2"
SPACED_KEY = spaced value
KEY_WITH_COMMENT=value # inline comment
```
Run `mix test` to verify these cases. Expected results:
```elixir
assert System.get_env("ENCRYPTION_KEY") == "secret123"
assert System.get_env("API_KEY") == "key with spaces"
assert System.get_env("EMPTY_KEY") == nil
assert System.get_env("KEY_WITH_EQUALS") == "abc=def"
assert System.get_env("EXPORT1_KEY") == "export1"
assert System.get_env("EXPORT2_KEY") == "export2"
assert System.get_env("SPACED_KEY") == "spaced value"
assert System.get_env("KEY_WITH_COMMENT") == "value"
```
See `test/env_loader_test.exs` for the full test suite.
## Contributing
Contributions are welcome! Please open an issue or pull request on [GitHub](https://github.com/Eygem/env_loader). For major changes, discuss them in an issue first. Ensure tests pass with `mix test`.
## License
Released under the MIT License. See the **[LICENSE](https://github.com/Eygem/env_loader/blob/main/LICENSE)** file for details.