Golang: перемещаем конфигурацию во внешний файл, чтобы было удобнее

Трудно управлять конфигурацией проекта, если она находится в коде. Работая в команде, разработчики продолжают добавлять различные конфигурации по всему проекту.

Я всегда перемещаю её во внешний файл, чтобы держать всю конфигурацию в одном месте. Это немного упрощает упрощает работу.

Почему держать конфигурацию во внешнем файле удобнее?

  • Один исполняемый файл для всех сред
  • Изменение конфигурации не требует новой сборки

Как это сделать?

Мы перенесём конфигурацию в файл YAML для сборки проекта Golang с Revel и GORM.

Эта схема относится к любому проекту Golang.

Ссылка на проект Github.

Мы переместим строку подключения к базе данных из файла conf/app.conf в новый файл config.yml

Строка подключения к базе данных в файле conf/app.conf выглядит так:

...
[dev]
db.info = user1:tmppwd@tcp(localhost:3306)/sampleapp?parseTime=True

Удаляем эти 2 строки и добавляем это в файл config.yml:

db: user1:tmppwd@tcp(localhost:3306)/sampleapp?parseTime=True

Теперь нужно прочитать файл конфигурации config.yml. Создаём новый справочник помощников в папке приложения. Создайте новый файл app_config.go в приложении/помощники:

package helpers

import (
	"fmt"
	"os"

	"gopkg.in/yaml.v2"
)

const configPath = "config.yml"

type Cfg struct {
	DB          string `yaml:"db"`
}

var AppConfig *Cfg

func ReadConfig() {
	f, err := os.Open(configPath)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()

	decoder := yaml.NewDecoder(f)
	err = decoder.Decode(&AppConfig)

	if err != nil {
		fmt.Println(err)
	}
}

Приведенный выше код считывает файл config.yml и заполняет переменную с именем AppConfig. Если вы хотите добавить дополнительные конфигурации в config.yml вам нужно изменить структуру Cfg.

В app/init.go прочитайте конфигурацию. При создании подключения к БД прочитайте строку подключения из AppConfig.

package app

import (
	"log"
	"github.com/revel/revel"
	_ "github.com/revel/modules"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
	"sampleapp/app/helpers"
)

...

var DB *gorm.DB

func initDB() {
	dbInfo := helpers.AppConfig.DB // Read from config
	db, err := gorm.Open("mysql", dbInfo)
	if err != nil {
		log.Panicf("Failed gorm.Open: %v\n", err)
	}

	DB = db
}

func init() {
  ...
        // Get the config
	revel.OnAppStart(helpers.ReadConfig);
	revel.OnAppStart(initDB)
}

...

В заключении

По моему опыту, наличие отдельного файла конфигурации всегда удобнее. Это можно применить к любому проекту Golang, независимо от структуры. Но всё, конечно же, зависит от ваших предпочтений.

Ответить