Как обрабатывать конфигурацию в Go [закрыто]

Я новичок в программировании Go, и мне интересно: каков предпочтительный способ обработки параметров конфигурации для программы Go (такие вещи можно использовать свойства файлы или ini файлы, в других контекстах)?

13 ответов


на JSON формат работал для меня довольно хорошо. Этот стандартная библиотека предлагает методы для записи структуры данных с отступом, поэтому она довольно читаемый.

см. также этот golang-орехи нити.

преимущества JSON заключаются в том, что он довольно прост в разборе и удобочитаем для чтения / редактирования предлагая семантику для списков и сопоставлений (что может стать довольно удобным), которая не так со многими конфигурациями ini-типа анализаторы.

пример использования:

conf.в JSON:

{
    "Users": ["UserA","UserB"],
    "Groups": ["GroupA"]
}

программа для чтения конфигурации

import (
    "encoding/json"
    "os"
    "fmt"
)

type Configuration struct {
    Users    []string
    Groups   []string
}

file, _ := os.Open("conf.json")
defer file.Close()
decoder := json.NewDecoder(file)
configuration := Configuration{}
err := decoder.Decode(&configuration)
if err != nil {
  fmt.Println("error:", err)
}
fmt.Println(configuration.Users) // output: [UserA, UserB]

другой вариант-использовать TOML, который является INI-подобным форматом, созданным Томом Престоном-Вернером. Я!--6-->построил парсер Go для него что это тщательно протестированы. Вы можете использовать его, как и другие варианты, предложенные здесь. Например, если у вас есть эти данные TOML в something.toml

Age = 198
Cats = [ "Cauchy", "Plato" ]
Pi = 3.14
Perfection = [ 6, 28, 496, 8128 ]
DOB = 1987-07-05T05:45:00Z

затем вы можете загрузить его в свою программу Go с чем-то вроде

type Config struct {
    Age int
    Cats []string
    Pi float64
    Perfection []int
    DOB time.Time
}

var conf Config
if _, err := toml.DecodeFile("something.toml", &conf); err != nil {
    // handle error
}

обычно я использую JSON для более сложных структур данных. Недостатком является то, что вы легко получаете кучу кода, чтобы сообщить пользователю, где была ошибка, различные крайние случаи и что нет.

для базовой конфигурации (ключи API, номера портов, ...) Мне очень повезло с gcfg пакета. Он основан на формате git файл config.

из документации:

пример конфигурации:

; Comment line
[section]
name = value # Another comment
flag # implicit value for bool is true

Go struct:

type Config struct {
    Section struct {
            Name string
            Flag bool
    }
}

и код, необходимый для его чтения:

var cfg Config
err := gcfg.ReadFileInto(&cfg, "myconfig.gcfg")

Он также поддерживает значения среза, поэтому вы можете разрешить указывать ключ несколько раз и другие приятные функции.


Випер - это система управления конфигурацией golang, которая работает с JSON, YAML и TOML. Выглядит довольно интересно.


просто используйте standard go флаги С iniflags.

стандартные флаги go имеют следующие преимущества:

  • идиоматическое.
  • прост в использовании. Флаги могут быть легко добавлены и разбросаны по произвольным пакетам, используемым проектом.
  • флаги в поддержку значений по умолчанию и описание.
  • флаги обеспечивают стандартный вывод "справки" со значениями по умолчанию и описание:.

единственный недостаток стандартных флагов go - это проблемы управления, когда количество флагов, используемых в вашем приложении, становится слишком большим.

Iniflags элегантно решает эту проблему: просто измените две строки в главном пакете, и он волшебным образом получит поддержку чтения значений флага из ini-файла. Флаги из ini-файлов можно переопределить, передав новые значения в командной строке.

Смотрите также https://groups.google.com/forum#!тема / голанг-орехи / TByzyPgoAQE для деталей.


и Gcfg который использует Ini-подобные файлы. Все просто - если вы хотите что-то простое, это хороший выбор.

вот код загрузки, который я использую в настоящее время, который имеет настройки по умолчанию и позволяет флагам командной строки (не показано), которые переопределяют некоторые из моих конфигураций:

package util

import (
    "code.google.com/p/gcfg"
)

type Config struct {
    Port int
    Verbose bool
    AccessLog string
    ErrorLog string
    DbDriver string
    DbConnection string
    DbTblPrefix string
}

type configFile struct {
    Server Config
}

const defaultConfig = `
    [server]
    port = 8000
    verbose = false
    accessLog = -
    errorLog  = -
    dbDriver     = mysql
    dbConnection = testuser:TestPasswd9@/test
    dbTblPrefix  =
`

func LoadConfiguration(cfgFile string, port int, verbose bool) Config {
    var err error
    var cfg configFile

    if cfgFile != "" {
        err = gcfg.ReadFileInto(&cfg, cfgFile)
    } else {
        err = gcfg.ReadStringInto(&cfg, defaultConfig)
    }

    PanicOnError(err)

    if port != 0 {
        cfg.Server.Port = port
    }
    if verbose {
        cfg.Server.Verbose = true
    }

    return cfg.Server
}

посмотреть gonfig

// load
config, _ := gonfig.FromJson(myJsonFile)
// read with defaults
host, _ := config.GetString("service/host", "localhost")
port, _ := config.GetInt("service/port", 80)
test, _ := config.GetBool("service/testing", false)
rate, _ := config.GetFloat("service/rate", 0.0)
// parse section into target structure
config.GetAs("service/template", &template)

https://github.com/spf13/viper и https://github.com/zpatrick/go-config являются довольно хорошими библиотеками для файлов конфигурации.


Я написал простую библиотеку конфигурации ini в golang.

https://github.com/c4pt0r/cfg

goroutine-безопасный, простой в использовании

package cfg
import (
    "testing"
)

func TestCfg(t *testing.T) {
    c := NewCfg("test.ini")
    if err := c.Load() ; err != nil {
        t.Error(err)
    }
    c.WriteInt("hello", 42)
    c.WriteString("hello1", "World")

    v, err := c.ReadInt("hello", 0)
    if err != nil || v != 42 {
        t.Error(err)
    }

    v1, err := c.ReadString("hello1", "")
    if err != nil || v1 != "World" {
        t.Error(err)
    }

    if err := c.Save(); err != nil {
        t.Error(err)
    }
}

===================обновление=======================

недавно мне нужен парсер INI с поддержкой раздела, и я пишу простой пакет:

github.com/c4pt0r/cfg

u может анализировать INI, как с помощью пакета "флаг":

package main

import (
    "log"
    "github.com/c4pt0r/ini"
)

var conf = ini.NewConf("test.ini")

var (
    v1 = conf.String("section1", "field1", "v1")
    v2 = conf.Int("section1", "field2", 0)
)

func main() {
    conf.Parse()

    log.Println(*v1, *v2)
}

использовать toml эта статья чтение конфигурационных файлов Go way


вы также можете быть заинтересованы в go-libucl, набор Привязок Go для UCL, универсального языка конфигурации. UCL немного похож на JSON, но с лучшей поддержкой для людей: он поддерживает комментарии и читаемые человеком конструкции, такие как множители SI (10k, 40M и т. д.) и имеет немного меньше шаблонной (например, кавычки вокруг ключей). Это на самом деле довольно близко к формату файла конфигурации nginx, если вы уже знакомы с этим.


Я согласен с Немо и я написал небольшой инструмент, чтобы сделать все это очень легко.

bitbucket.org/gotamer/cfg пакет конфигурацию JSON

  • вы определяете элементы конфигурации в своем приложении как структуру.
  • шаблон конфигурационного файла json из вашей структуры сохраняется при первом запуске
  • вы можете сохранить изменения среды выполнения в config

см. doc.пойдите для примера


Я попробовал JSON. Это сработало. Но я ненавижу создавать структуру точных полей и типов, которые я мог бы установить. Для меня это было болью. Я заметил, что это был метод, используемый всеми параметрами конфигурации, которые я мог найти. Возможно, мой опыт в динамических языках делает меня слепым к преимуществам такой многословности. Я сделал новый простой формат файла конфигурации и более динамичный lib для его чтения из.

https://github.com/chrisftw/ezconf

Я довольно новичок в мире Go, поэтому это может быть не путь Go. Но он работает, это довольно быстро, и очень прост в использовании.

плюсы

  • супер просто
  • меньше кода

минусы

  • нет массивов или типов карт
  • очень плоский формат файла
  • нестандартные файлы conf
  • есть небольшая условность, которую я сейчас нахмурился вообще в Go community. (Ищет файл конфигурации в каталоге config)