Либа конфига
При организации пакета конфига часто используют следующий вариант:
package config
type Config struct {
Database DatabaseConfig
Kafka KafkaConfig
}
type DatabaseConfig struct { /// }
type KafkaConfig struct { /// }
Пакет config, который содержит главную структуру конфига, а также все подструктуры.
Минус этого варианта в том, что пакет, например, бд будет делать импорт DatabaseConfig из пакета общего конфига, пакет кафки - KafkaConfig итд.
Гораздо более логичен вариант, когда каждая подструктура конфига лежит в своем пакете, а в пакет общего конфига всё это импортируется:
package config
type Config struct {
Database database.Config
Kafka kafka.Config
}
Однако, тогда в подструктурах могут быть теги от либы, считывания конфига, что делает хоть и неявную, но все же зависимость от либы конфига:
package database
type Config struct {
User string `yaml:"user"`
Password string `env:"password"`
}
и если тэг для user можно иногда убрать (т.к. user считается неявно в некоторых либах т.к. они под капотом используют mapstructure), то с env так сделать не выйдет.
Из-за отсутствия этой возможности и некоторых других я написал свою либу для конфига. Она по большей части основывается на koanf - имхо лучшей либе для конфига в go (у нее прекрасный интерфейс, намного более красивый, чем у viper) и добавляет некоторые фичи.
Чего не хватало в существующих:
- Возможности задать название env'а не в тегах структуры, а в самом файле конфига {"env": "DB_PASSWORD"}
- Ошибки, если поле в структуре есть, а в ямле отсутствует (чтобы забытое значение не превратилось в zero-value)
- Ошибки, если поле в ямле есть, а в структуре отсутствует (чтобы мусора в ямле не было)
- Опционального считывания. Если поле в структуре - указатель, то ошибки не будет при отсутствии его в ямле
Также либа поддерживает всё, что поддерживает сам koanf
https://github.com/rostislaved/cleanconfig
При организации пакета конфига часто используют следующий вариант:
package config
type Config struct {
Database DatabaseConfig
Kafka KafkaConfig
}
type DatabaseConfig struct { /// }
type KafkaConfig struct { /// }
Пакет config, который содержит главную структуру конфига, а также все подструктуры.
Минус этого варианта в том, что пакет, например, бд будет делать импорт DatabaseConfig из пакета общего конфига, пакет кафки - KafkaConfig итд.
Гораздо более логичен вариант, когда каждая подструктура конфига лежит в своем пакете, а в пакет общего конфига всё это импортируется:
package config
type Config struct {
Database database.Config
Kafka kafka.Config
}
Однако, тогда в подструктурах могут быть теги от либы, считывания конфига, что делает хоть и неявную, но все же зависимость от либы конфига:
package database
type Config struct {
User string `yaml:"user"`
Password string `env:"password"`
}
и если тэг для user можно иногда убрать (т.к. user считается неявно в некоторых либах т.к. они под капотом используют mapstructure), то с env так сделать не выйдет.
Из-за отсутствия этой возможности и некоторых других я написал свою либу для конфига. Она по большей части основывается на koanf - имхо лучшей либе для конфига в go (у нее прекрасный интерфейс, намного более красивый, чем у viper) и добавляет некоторые фичи.
Чего не хватало в существующих:
- Возможности задать название env'а не в тегах структуры, а в самом файле конфига {"env": "DB_PASSWORD"}
- Ошибки, если поле в структуре есть, а в ямле отсутствует (чтобы забытое значение не превратилось в zero-value)
- Ошибки, если поле в ямле есть, а в структуре отсутствует (чтобы мусора в ямле не было)
- Опционального считывания. Если поле в структуре - указатель, то ошибки не будет при отсутствии его в ямле
Также либа поддерживает всё, что поддерживает сам koanf
https://github.com/rostislaved/cleanconfig