Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Gregory Eremin 46128ee4f6 Add more comments and documentation 7 years ago
demo Add more comments and documentation 7 years ago
static Add web server 7 years ago
LICENCE Add licence 7 years ago
README.md Add more comments and documentation 7 years ago
field.go Use json keys as field path tokens 7 years ago
field_test.go Fix tests 7 years ago
file_ops.go Add demo project 7 years ago
secondly.go Add more comments and documentation 7 years ago
secondly_test.go Give package a new name 7 years ago
server.go Add web server 7 years ago
static.rice-box.go Add compiled assets 7 years ago



Secondly is a configuration management plugin for Go projects. It takes care of the app's configuration, specifically of updating it in runtime.


First, we need to define a struct that will hold the app's configuration. Let's make it simple for demonstration purposes.

type Config struct {
    AppName string  `json:"app_name"`
    Version float32 `json:"version"`

Make sure you've added json tags to each field.

Next, right where you will define your app's flags, ask Secondly to add one for configuration file.


Now you can pass a configuration file to your program like this:

./app -config=config.json

Now we need to ask Secondly to take care of your configuration:

var conf Config

// or asynchronously
go secondly.Manage(&conf)

If you prefer to configure the app asynchronously, then you'll probably want to know when configuration is loaded, so there's a handy helper function just for that:

    log.Println("Configuration initialized")

Congratulations! You've just configured Secondly to read and initialize the configuration of your app. But this is not what you came for, right?

If you want a configuration GUI, simply start Secondly's web server on a port you want.

secondly.StartServer("", 5500)

Tired of restarting the app every time you modify the config? You're not alone.


Want some more control over when specifically the config will be reloaded? Ask Secondly to listen for SIGHUP syscalls.


You can also set up callback functions on specific fields and receive a call when this field's value changes.

// Refer to a field using its json tag
secondly.OnChange("num_workers", func(oldVal, newVal interface{}) {
    old := oldVal.(int)
    cur := newVal.(int)
    if cur > old {
        pool.AddWorkers(cur - old)
    } else {
        pool.StopWorkers(old - cur)
    log.Println("Number of workers changed from %d to %d", old, cur)

Full example can be found here.

Demo Screenshot


The only thing to keep in mind when building Secondly is to convert assets into a binary form so they could be kept in memory of your app and would not require any additional web server configuration.

go get github.com/GeertJohan/go.rice/rice
rice embed-go
go build


Secondly is distributed under the MIT Licence.