Popularity
4.0
Growing
Activity
0.0
-
95
3
1
Programming language: Go
License: MIT License
Tags:
Configuration
Latest version: v1.3.0
envh alternatives and similar packages
Based on the "Configuration" category.
Alternatively, view envh alternatives based on common mentions on social networks and blogs.
-
kelseyhightower/envconfig
Go library for managing configuration data from environment variables. -
konfig
Composable, observable and performant config handling for Go for the distributed processing era. -
koanf
Light weight, extensible library for reading config in Go applications. Built in support for JSON, TOML, YAML, env, command line. -
hjson
Human JSON, a configuration file format for humans. Relaxed syntax, fewer mistakes, more comments. -
gookit/config
application config manage(load,get,set). support JSON, YAML, TOML, INI, HCL. multi file load, data override merge. -
gcfg
read INI-style configuration files into Go structs; supports user-defined types and subsections -
goConfig
Parse a struct as input and populates the fields of this struct with parameters fom command line, environment variables and configuration file. -
joshbetz/config
A small configuration library for Go that parses environment variables, JSON files, and reloads automatically on SIGHUP. -
harvester
Harvester, a easy to use static and dynamic configuration package supportig seeding, env vars and Consul integration. -
onion
Layer based configuration for Go, Supports JSON, TOML, YAML, properties, etcd, env, and encryption using PGP. -
configuro
opinionated configuration loading & validation framework from ENV and Files focused towards 12-Factor compliant applications. -
configure
Provides configuration through multiple sources, including JSON, flags and environment variables. -
configuration
Library for initializing configuration structs from env variables, files, flags and 'default' tag. -
hocon
Configuration library for working with the HOCON(a human-friendly JSON superset) format, supports features like environment variables, referencing other values, comments and multiple files. -
sprbox
Build-environment aware toolbox factory and agnostic config parser (YAML, TOML, JSON and Environment vars). -
swap
Instantiate/configure structs recursively, based on build environment. (YAML, TOML, JSON and env). -
gonfig
Tag-based configuration parser which loads values from different providers into typesafe struct. -
gone/jconf
Modular JSON configuration. Keep you config structs along the code they configure and delegate parsing to submodules without sacrificing full config serialization.
Get performance insights in less than 4 minutes
Scout APM uses tracing logic that ties bottlenecks to source code so you know the exact line of code causing performance issues and can get back to building a great product faster.
Sponsored
scoutapm.com
Do you think we are missing an alternative of envh or a related project?
Popular Comparisons
README
Envh

This library is made up of two parts :
- Env object : it wraps your environments variables in an object and provides convenient helpers.
- Env tree object : it manages environment variables through a tree structure to store a config the same way as in a yaml file or whatever format allows to store a config hierarchically
Install
go get github.com/antham/envh
How it works
Check the godoc, there are many examples provided.
Example with a tree dumped in a config struct
package envh
import (
"encoding/json"
"fmt"
"os"
"strings"
)
type CONFIG2 struct {
DB struct {
USERNAME string
PASSWORD string
HOST string
NAME string
PORT int
URL string
USAGELIMIT float32
}
MAILER struct {
HOST string
USERNAME string
PASSWORD string
ENABLED bool
}
MAP map[string]string
}
func (c *CONFIG2) Walk(tree *EnvTree, keyChain []string) (bool, error) {
if setter, ok := map[string]func(*EnvTree, []string) error{
"CONFIG2_DB_URL": c.setURL,
"CONFIG2_MAP": c.setMap,
}[strings.Join(keyChain, "_")]; ok {
return true, setter(tree, keyChain)
}
return false, nil
}
func (c *CONFIG2) setMap(tree *EnvTree, keyChain []string) error {
datas := map[string]string{}
keys, err := tree.FindChildrenKeys(keyChain...)
if err != nil {
return err
}
for _, key := range keys {
value, err := tree.FindString(append(keyChain, key)...)
if err != nil {
return err
}
datas[key] = value
}
c.MAP = datas
return nil
}
func (c *CONFIG2) setURL(tree *EnvTree, keyChain []string) error {
datas := map[string]string{}
for _, key := range []string{"USERNAME", "PASSWORD", "HOST", "NAME"} {
value, err := tree.FindString("CONFIG2", "DB", key)
if err != nil {
return err
}
datas[key] = value
}
port, err := tree.FindInt("CONFIG2", "DB", "PORT")
if err != nil {
return err
}
c.DB.URL = fmt.Sprintf("jdbc:mysql://%s:%d/%s?user=%s&password=%s", datas["HOST"], port, datas["NAME"], datas["USERNAME"], datas["PASSWORD"])
return nil
}
func ExampleStructWalker_customFieldSet() {
os.Clearenv()
setEnv("CONFIG2_DB_USERNAME", "foo")
setEnv("CONFIG2_DB_PASSWORD", "bar")
setEnv("CONFIG2_DB_HOST", "localhost")
setEnv("CONFIG2_DB_NAME", "my-db")
setEnv("CONFIG2_DB_PORT", "3306")
setEnv("CONFIG2_DB_USAGELIMIT", "95.6")
setEnv("CONFIG2_MAILER_HOST", "127.0.0.1")
setEnv("CONFIG2_MAILER_USERNAME", "foo")
setEnv("CONFIG2_MAILER_PASSWORD", "bar")
setEnv("CONFIG2_MAILER_ENABLED", "true")
setEnv("CONFIG2_MAP_KEY1", "value1")
setEnv("CONFIG2_MAP_KEY2", "value2")
setEnv("CONFIG2_MAP_KEY3", "value3")
env, err := NewEnvTree("^CONFIG2", "_")
if err != nil {
return
}
s := CONFIG2{}
err = env.PopulateStruct(&s)
if err != nil {
return
}
b, err := json.Marshal(s)
if err != nil {
return
}
fmt.Println(string(b))
// Output:
// {"DB":{"USERNAME":"foo","PASSWORD":"bar","HOST":"localhost","NAME":"my-db","PORT":3306,"URL":"jdbc:mysql://localhost:3306/my-db?user=foo\u0026password=bar","USAGELIMIT":95.6},"MAILER":{"HOST":"127.0.0.1","USERNAME":"foo","PASSWORD":"bar","ENABLED":true},"MAP":{"KEY1":"value1","KEY2":"value2","KEY3":"value3"}}
}