/
Praxis/

Управление конфигурацией

Любое серьёзное приложение должно уметь гибко настраиваться. Жёстко зашивать в код параметры (API-ключи, секреты, пути) — плохая практика: секреты утекут в Git, а для изменения настроек придётся пересобирать программу. На этом этапе мы создадим систему конфигурации, которая читает все настройки из внешнего YAML-файла.

Ключевая концепция: Внешняя конфигурация через YAML

— формат хранения настроек, удобный для чтения и редактирования. Пакет gopkg.in/yaml.v3 маппит поля YAML-файла на поля Go-структуры через теги. Секреты выносятся в конфигурационный файл, а сам файл добавляется в — так чувствительные данные не попадают в репозиторий.

type Config struct { Env string `yaml:"env"` } data, _ := os.ReadFile("config.yaml") var cfg Config yaml.Unmarshal(data, &cfg)

💡 Gotcha: Не забудьте добавить config.yaml в .gitignore до первого коммита. Если файл с секретами попадёт в историю Git — удалить его оттуда будет непросто.

Используемые пакеты

ПакетНазначениеКлючевые функции
gopkg.in/yaml.v3Чтение/запись YAMLUnmarshal, Marshal
osРабота с файламиReadFile

Цели этапа

Создать систему конфигурации и точку входа приложения.

Что необходимо сделать:

Пакет src/internal/config:

  • Структура Config:

    • Поле Env (string) — окружение (local, dev, prod), с yaml-тегом env
  • Функция:

    func Load(path string) (*Config, error)

    Логика:

    1. Прочитать файл по указанному пути
    2. Десериализовать YAML в структуру Config
    3. При ошибке чтения или парсинга — вернуть ошибку

Файлы в корне проекта:

  • Файл config.yaml с полем env: "local"
  • Файл .gitignore с записью config.yaml

Пакет src/cmd/disksync:

  • Файл main.go — точка входа: Логика: вызвать config.Load, вывести значение Env, обработать ошибки.

Пример работы

$ go run src/cmd/disksync/main.go Configuration loaded successfully, env: local

При отсутствии файла конфигурации:

$ go run src/cmd/disksync/main.go failed to load configuration: open config.yaml: no such file or directory

Полезные материалы

  • gopkg.in/yaml.v3 — документация пакета
  • The 12-Factor App: Config — принципы хранения конфигурации
  • os.ReadFile — чтение файла целиком
  • Работа с файлами в Go — на русском

Критерии

не проверялось
  • Структура Config в пакете src/internal/config содержит поле Env string с yaml-тегом env
  • Функция Load(path string) (*Config, error) создана в пакете src/internal/config и десериализует YAML через yaml.Unmarshal
  • Файл main.go в src/cmd/disksync содержит package main и вызывает config.Load
  • Файл .gitignore существует и содержит запись config.yaml
Войдите в аккаунт, чтобы начать проект
Запустите первую проверку