dotenv is a library that loads environment variables from a .env
file into std.os.environ
.
Storing configuration in the environment separate from code is based on The
Twelve-Factor App methodology.
This library is a Zig language port of nodejs dotenv.
Test with Zig 0.13.0
Automatically find the .env
file and load the variables into the process environment with just one line.
const std = @import("std");
const dotenv = @import("dotenv");
pub fn main() !void {
const allocator = std.heap.page_allocator;
try dotenv.load(allocator, .{});
}
By default, it will search for a file named .env
in the working directory and its parent directories recursively.
Of course, you can specify a path if desired.
pub fn main() !void {
try dotenv.loadFrom(allocator, "/app/.env", .{});
}
Since writing to std.os.environ
requires a C setenv
call, linking with C is necessary.
If you only want to read and parse the contents of the .env
file, you can try the following.
pub fn main() !void {
var envs = try dotenv.getDataFrom(allocator, ".env");
var it = envs.iterator();
while (it.next()) |*entry| {
std.debug.print(
"{s}={s}\n",
.{ entry.key_ptr.*, entry.value_ptr.*.? },
);
}
}
This does not require linking with a C library. The caller owns the memory, so you need to free both the key and value in the hashmap.
NAME_1="VALUE_1"
NAME_2='VALUE_2'
NAME_3=VALUE_3
The value of a variable can span multiple lines(quotes are required).
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
ABCD...
-----END RSA PRIVATE KEY-----"
Comments start with a #
.
# This is a comment
NAME="VALUE" # comment
You can reference a variable using ${}
, and the variable should be defined earlier.
HO="/home"
ME="/koyori"
HOME="${HO}${ME}" # equal to HOME=/home/koyori
MIT License Copyright (c) 2023-2024, Hanaasagi