Para CLIs maiores, variáveis de ambiente devem entrar em uma ordem de precedência clara com flags e arquivos. Veja o guia de configuração para CLI em Zig para um desenho completo.
Introdução
Variáveis de ambiente são uma forma padrão de configurar aplicações sem modificar código. Elas são usadas para definir caminhos, credenciais, modo de execução e outras configurações. Em Zig, você pode acessar variáveis de ambiente através de std.posix.getenv() e std.process.getEnvMap().
Nesta receita, você aprenderá a ler e utilizar variáveis de ambiente em seus programas.
Pré-requisitos
- Zig instalado (versão 0.13+). Veja o guia de instalação
- Conhecimento básico de Zig. Consulte a introdução ao Zig
Ler uma Variável de Ambiente
const std = @import("std");
pub fn main() !void {
// Ler variável HOME
if (std.posix.getenv("HOME")) |home| {
std.debug.print("HOME: {s}\n", .{home});
} else {
std.debug.print("HOME não definida\n", .{});
}
// Ler variável PATH
if (std.posix.getenv("PATH")) |path_val| {
std.debug.print("PATH: {s}\n", .{path_val});
}
// Ler variável USER
if (std.posix.getenv("USER")) |user| {
std.debug.print("USER: {s}\n", .{user});
}
// Variável que pode não existir
if (std.posix.getenv("MINHA_VARIAVEL")) |val| {
std.debug.print("MINHA_VARIAVEL: {s}\n", .{val});
} else {
std.debug.print("MINHA_VARIAVEL não definida\n", .{});
}
}
Variável com Valor Padrão
const std = @import("std");
fn getEnvOuPadrao(nome: []const u8, padrao: []const u8) []const u8 {
return std.posix.getenv(nome) orelse padrao;
}
pub fn main() !void {
const porta = getEnvOuPadrao("PORT", "8080");
const host = getEnvOuPadrao("HOST", "localhost");
const modo = getEnvOuPadrao("MODE", "development");
const log_level = getEnvOuPadrao("LOG_LEVEL", "info");
std.debug.print("Configuração do servidor:\n", .{});
std.debug.print(" Host: {s}\n", .{host});
std.debug.print(" Porta: {s}\n", .{porta});
std.debug.print(" Modo: {s}\n", .{modo});
std.debug.print(" Log: {s}\n", .{log_level});
}
Listar Todas as Variáveis de Ambiente
const std = @import("std");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
// Obter mapa de todas as variáveis
var env_map = try std.process.getEnvMap(allocator);
defer env_map.deinit();
std.debug.print("Variáveis de ambiente ({d} total):\n", .{env_map.count()});
var it = env_map.iterator();
var count: usize = 0;
while (it.next()) |entry| {
if (count < 10) { // Mostrar apenas as 10 primeiras
std.debug.print(" {s} = {s}\n", .{ entry.key_ptr.*, entry.value_ptr.* });
}
count += 1;
}
if (count > 10) {
std.debug.print(" ... e mais {d} variáveis\n", .{count - 10});
}
}
Configuração de Aplicação via Ambiente
const std = @import("std");
const AppConfig = struct {
host: []const u8,
porta: u16,
debug: bool,
db_url: []const u8,
max_conexoes: u32,
pub fn fromEnv() AppConfig {
const porta_str = std.posix.getenv("APP_PORT") orelse "3000";
const porta = std.fmt.parseInt(u16, porta_str, 10) catch 3000;
const max_str = std.posix.getenv("APP_MAX_CONN") orelse "100";
const max_conn = std.fmt.parseInt(u32, max_str, 10) catch 100;
const debug_str = std.posix.getenv("APP_DEBUG") orelse "false";
const debug = std.mem.eql(u8, debug_str, "true") or std.mem.eql(u8, debug_str, "1");
return .{
.host = std.posix.getenv("APP_HOST") orelse "0.0.0.0",
.porta = porta,
.debug = debug,
.db_url = std.posix.getenv("DATABASE_URL") orelse "sqlite://local.db",
.max_conexoes = max_conn,
};
}
pub fn imprimir(self: AppConfig) void {
std.debug.print("=== Configuração da Aplicação ===\n", .{});
std.debug.print(" Host: {s}\n", .{self.host});
std.debug.print(" Porta: {d}\n", .{self.porta});
std.debug.print(" Debug: {}\n", .{self.debug});
std.debug.print(" DB URL: {s}\n", .{self.db_url});
std.debug.print(" Max Conexões: {d}\n", .{self.max_conexoes});
}
};
pub fn main() !void {
const config = AppConfig.fromEnv();
config.imprimir();
}
Dicas e Boas Práticas
Sempre forneça valores padrão: Nunca assuma que uma variável de ambiente existe.
Valide valores numéricos: Use
catchao parsear inteiros de variáveis de ambiente.Não armazene segredos no código: Use variáveis de ambiente para senhas, tokens e chaves.
Documente as variáveis: Mantenha uma lista das variáveis de ambiente que sua aplicação usa.
Receitas Relacionadas
- Argumentos de Linha de Comando - Argumentos CLI
- Executar Processos Externos - Processos com ambiente
- Como parsear JSON em Zig - Configuração JSON
- Ler Conteúdo de Arquivo - Arquivos de configuração