Golang: перемещаем конфигурацию во внешний файл, чтобы было удобнее
Трудно управлять конфигурацией проекта, если она находится в коде. Работая в команде, разработчики продолжают добавлять различные конфигурации по всему проекту.
Я всегда перемещаю её во внешний файл, чтобы держать всю конфигурацию в одном месте. Это немного упрощает упрощает работу.
Почему держать конфигурацию во внешнем файле удобнее?
- Один исполняемый файл для всех сред
- Изменение конфигурации не требует новой сборки
Как это сделать?
Мы перенесём конфигурацию в файл YAML для сборки проекта Golang с Revel и GORM.
Эта схема относится к любому проекту Golang.
Мы переместим строку подключения к базе данных из файла 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, независимо от структуры. Но всё, конечно же, зависит от ваших предпочтений.