Skip to content

owenthereal/conf

Repository files navigation

Conf

A configuration loader in Go. Load configuration with files, environment variables and command-line arguments.

Load Configuration from Multiple Sources

Configuration management can get complicated very quickly for even trivial applications running in production. conf addresses this problem by enabling you to load configuration from different sources. The order in which you attach these configuration sources determines their priority. The last attached source has the highest priority. These are the supported sources:

Here is an example of loading configuration in priority:

package main

import "github.com/jingweno/conf"

func main() {
  loader := conf.NewLoader()

  // 1. any overrides
  loader.Overrides(
    map[string]interface{}{
      "always": "be this value",
    }
  )

  // 2. environment variables
  // 3. command line arguments
  loader.Env().Argv()

  // 4. values from `config.json`
  loader.File("/path/to/config.json")

  // 5. more values from `another_config.json`
  loader.File("/path/to/another_config.json")

  // 6. any default values
  loader.Defaults(
    map[string]interface{}{
      "if nothing else": "use this value"
    }
  )

  c, err := loader.Load()
  // do something with c
}

Example

Consider the following Go code:

package main

import (
	"fmt"
	"github.com/jingweno/conf"
	"os"
)

func main() {
	d := map[string]interface{}{
		"GO_ENV":        "development",
		"DATABASE_NAME": "example_development",
		"DATABASE_POOL": 5,
	}
	c, err := conf.NewLoader().Argv().Env().File("./config.json").Defaults(d).Load()

	if err != nil {
		fmt.Fprintf(os.Stderr, "err: %s\n", err)
		return
	}

	printConf(c, "GO_ENV")
	printConf(c, "DATABASE")
	printConf(c, "DATABASE_NAME")
	printConf(c, "DATABASE_HOST")
	printConf(c, "DATABASE_PORT")
	printConf(c, "DATABASE_POOL")
}

func printConf(c *conf.Conf, k string) {
	fmt.Printf("%s: %v\n", k, c.Get(k))
}

and a config.json:

{
  "DATABASE": "postgres",
  "DATABASE_HOST": "127.0.0.1",
  "DATABASE_PORT": "1234"
}

If you run the above code:

$ GO_ENV=production go run example.go --DATABASE_POOL 10

The output will be:

GO_ENV: production
DATABASE: postgres
DATABASE_NAME: example_development
DATABASE_HOST: 127.0.0.1
DATABASE_PORT: 1234
DATABASE_POOL: 10

More examples are available.

License

conf is released under the MIT license. See LICENSE.md.

Releases

No releases published

Packages

No packages published

Languages