Keep your configuration clean. Keep your secrets safe.
Installation β’ Quick Start β’ Features β’ Examples β’ Contributing
You love YAML for configurationβit's clean, readable, and organized. But what about sensitive data like API keys, database passwords, and tokens? Hardcoding them is a security nightmare. π±
envYaml bridges the gap between clean YAML configuration and secure environment variable management. Reference environment variables directly in your YAML files, and envYaml handles the rest!
# config.yml - Clean and secure! π
database:
host: localhost
port: 5432
password: ${DB_PASSWORD} # Loaded from environment
api:
key: ${API_KEY} # Never committed to git
secret: ${API_SECRET} # Always securego get github.com/yuseferi/envyaml@latestRequirements: Go 1.25+
1. Create your YAML configuration:
# config.yml
host: localhost
port: 3606
password: ${DB_PASSWORD}2. Define your config struct:
type Config struct {
Host string `yaml:"host" env:"HOST"`
Port int `yaml:"port" env:"PORT"`
Password string `yaml:"password" env:"DB_PASSWORD,required"`
}3. Load and use:
package main
import (
"fmt"
"log"
"github.com/yuseferi/envyaml"
)
func main() {
var cfg Config
if err := envyaml.LoadConfig("config.yml", &cfg); err != nil {
log.Fatal(err)
}
fmt.Printf("Connected to %s:%d\n", cfg.Host, cfg.Port)
}| Feature | Description |
|---|---|
| π Seamless Integration | Combine YAML files with environment variables effortlessly |
| β Required Variables | Mark critical env vars as required with automatic validation |
| π·οΈ Struct Tags | Use familiar yaml and env struct tags |
| π‘οΈ Type Safety | Full Go type safety with automatic type conversion |
| π¦ Zero Config | Works out of the box with sensible defaults |
| πͺΆ Lightweight | Minimal dependencies, maximum performance |
Mark sensitive variables as required to fail fast if they're missing:
type Config struct {
Host string `yaml:"host" env:"HOST"`
Port int `yaml:"port" env:"PORT"`
Password string `yaml:"password" env:"DB_PASSWORD,required"` // π Required!
}
var cfg Config
err := envyaml.LoadConfig("config.yml", &cfg)
if err != nil {
// Error: failed to parse environment variables: env: required environment variable "DB_PASSWORD" is not set
log.Fatal(err)
}package main
import (
"fmt"
"log"
"os"
"github.com/yuseferi/envyaml"
)
type DatabaseConfig struct {
Host string `yaml:"host" env:"DB_HOST"`
Port int `yaml:"port" env:"DB_PORT"`
Username string `yaml:"username" env:"DB_USER"`
Password string `yaml:"password" env:"DB_PASSWORD,required"`
Database string `yaml:"database" env:"DB_NAME"`
}
type Config struct {
Database DatabaseConfig `yaml:"database"`
Debug bool `yaml:"debug" env:"DEBUG"`
}
func main() {
// Set environment variables (in production, these come from your environment)
os.Setenv("DB_PASSWORD", "super_secret_password")
var cfg Config
if err := envyaml.LoadConfig("config.yml", &cfg); err != nil {
log.Fatalf("Failed to load config: %v", err)
}
fmt.Printf("Database: %s@%s:%d/%s\n",
cfg.Database.Username,
cfg.Database.Host,
cfg.Database.Port,
cfg.Database.Database,
)
}With this config.yml:
database:
host: localhost
port: 5432
username: admin
password: ${DB_PASSWORD}
database: myapp
debug: falseOutput:
Database: admin@localhost:5432/myapp
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β YAML File β β Environment β β Go Struct β
β β β Variables β β β
β host: localhostβ β β β Host: localhostβ
β port: 3606 β βββΊ β DB_PASSWORD= β βββΊ β Port: 3606 β
β password: ${..}β β "secret123" β β Password: ... β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β β β
βββββββββββββββββββββββββ΄ββββββββββββββββββββββββ
envYaml
- Read - Parse your YAML configuration file
- Merge - Overlay environment variables using struct tags
- Validate - Ensure required variables are present
- Return - Provide a fully populated, type-safe config struct
This project uses Task for managing development tasks.
# Build the project
task build
# Run tests
task test
# Run tests with coverage
task test-coverage
# Clean generated files
task clean
# Run all tasks
task allWe love contributions! β€οΈ
- π΄ Fork the repository
- πΏ Create your feature branch (
git checkout -b feature/amazing-feature) - πΎ Commit your changes (
git commit -m 'Add amazing feature') - π€ Push to the branch (
git push origin feature/amazing-feature) - π Open a Pull Request
Please feel free to:
- π Report bugs
- π‘ Suggest new features
- π Improve documentation
- β Star the project if you find it useful!
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.