--- name: dotenv_load kind: function lang: go domain: infra version: "1.0.0" purity: impure signature: "func DotenvLoad(path string) error" description: "Parsea un archivo .env (KEY=VALUE), ignora comentarios # y lineas vacias, y llama os.Setenv para cada par. No sobreescribe variables ya presentes en el entorno. Soporta valores con comillas simples o dobles." tags: [dotenv, env, config, os, infra] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [bufio, fmt, os, strings] params: - name: path desc: "ruta al archivo .env a parsear (ej: \".env\", \"config/.env.production\")" output: "nil si el archivo se parseo y aplico correctamente, error si el archivo no existe o tiene formato invalido" tested: true tests: - "parsea KEY=VALUE y setea variable" - "ignora lineas comentario y vacias" - "no sobreescribe variables ya seteadas" - "valores con comillas dobles se stripean" - "valores con comillas simples se stripean" - "archivo inexistente retorna error" - "linea sin signo igual retorna error" test_file_path: "functions/infra/dotenv_load_test.go" file_path: "functions/infra/dotenv_load.go" --- ## Ejemplo ```go // Al inicio de la app, cargar .env sin sobrescribir vars de CI/CD if err := DotenvLoad(".env"); err != nil { log.Printf("warning: %v (ok if running in CI)", err) } // Ahora os.Getenv("DATABASE_URL") funciona ``` ## Notas Solo stdlib. Semantica de no-sobreescritura permite que variables inyectadas por CI/CD o Docker tengan precedencia sobre el .env local. Formato soportado: KEY=VALUE, KEY="valor con espacios", KEY='valor'. Los comentarios inline (#) no se stripean — el valor raw tras = se usa completo (sin comillas externas).