Rust. Работа с конфигурациями
Nikolay Gushcharin августа 17, 2025 Изменено: августа 17, 2025 #rust #config #config-rs #dotenvyКак в любом приложении, хоть Web, хоть Desktop, необходимо использовать конфигурации. Они могут быть записаны в переменных окружения среды выполнения, либо же в отдельных файлах, таких как json, xml, env или toml.
Во многих языках программирования, например в C#, работа с конфигурациями уже является стандартизированной, и можно использовать готовые библиотеки, которые предоставляют полноценный функционал. В Rust же необходимо искать отдельные крейты. В этой статье рассмотрим те крейты, которые я сам использую в своих проектах для работы с конфигурациями.
1. dotenvy — работа с .env файлами
Крейт dotenvy предоставляет удобный способ загрузки переменных окружения из .env файлов. Это особенно полезно при разработке приложений, когда не хочется прописывать конфигурации в переменных окружения системы.
Установка
Добавьте в Cargo.toml:
[]
= "0.15"
или можно выполнить команду
Пример использования
use dotenv;
use env;
Лучшие практики
- Не следует коммитить
.envфайлы — добавляйте их в.gitignore. Для того, чтобы пользователям обозначить шаблон конфигураций достаточно сделать отедельный файл.env.example, который будет содержать примеры, но без конкретных значений - Проверяйте наличие переменных — всегда обрабатывайте ошибки, если переменная не установлена.
.env.localдля локальной разработки - я использую этот файл для упрощенной локальной конфигурации, при этом он просто добавлен в.gitingone
Если использовать файл .env.local, то можно чуть улучшить инициализацию dotenvy, в котором будет определяться выбор исходного файла
Увы, не получилось нормально вынести в общую обработку результата load_result, потому что from_path и dotenv имеют разное возвращаемое значение.
2. envconfig — автоматическое парсинг переменных окружения в структуры
envconfig позволяет автоматически парсить переменные окружения в Rust-структуры, что делает работу с конфигурациями более удобной и типобезопасной.
Установка
[]
= { = "0.13", = ["derive"] }
Пример использования
use Envconfig;
Лучшие практики
- Используйте
default— задавайте значения по умолчанию для переменных, которые не критичны. - Группируйте конфигурации — создавайте отдельные структуры для разных частей приложения (например,
DatabaseConfig,ServerConfig). - Документируйте переменные — добавляйте комментарии к полям структуры, чтобы было понятно, какие переменные нужны.
3. config-rs — универсальный конфигурационный крейт
config-rs — это мощный крейт для работы с конфигурациями, который поддерживает множество форматов (JSON, YAML, TOML и др.) и источников (файлы, переменные окружения).
Установка
[]
= { = "0.15", = ["json"] }
= { = "1.0", = ["derive"] }
Пример использования (TOML + переменные окружения)
use ;
use Deserialize;
Вложенные структуры с TOML
use Deserialize;
config.toml:
[]
= "postgres://user:pass@localhost:5432/db"
= 20
[]
= "0.0.0.0"
= 8080
= true
Загрузка конфига:
use Config;
Вложенные структуры с массивами
Структуры:
config.yaml:
redis:
hosts:
- "redis1:6379"
- "redis2:6379"
timeout_ms: 500
allowed_origins:
- "https://example.com"
- "https://api.example.com"
Использование config-rs с переменными окружения для вложенных структур
В таком случае имена переменных формируются по следующим правилам:
Стандартный подход (с разделителем _)
Для структуры переменные окружения будут называться так:
APP_DATABASE_CFG_CONNECTION_STRING=your_connection_string
APP_DATABASE_CFG_CONNECTION_ROLE=your_role
APP_BOT_CFG_TOKEN=your_bot_token
APP_BOT_CFG_WEBHOOK_URL=your_webhook_url
Пример загрузки:
let cfg = builder
.add_source
.build?;
Альтернативные варианты именования
-
Кастомный разделитель (например,
__):// Переменные будут: APP__DATABASE_CFG__CONNECTION_STRING .add_source -
Упрощенное именование (игнорируя названия вложенных структур):
APP_DB_CONNECTION_STRING APP_BOT_TOKEN(но тогда нужно вручную мапить поля)
-
Префиксы по функциональности:
DB_CONNECTION_STRING BOT_TOKEN(используя разные префиксы для разных компонентов)
Как сделать именование более удобным
-
Использовать более плоскую структуру:
Тогда переменные будут проще:
APP_DB_CONNECTION_STRING APP_BOT_TOKEN -
Кастомизировать имена через атрибуты:
Лучшие практики
- Используйте иерархические конфиги — разделяйте конфигурацию по разным файлам (
database.toml,server.toml). - Используйте конфигурации для разных сред - подобный подход есть в
dotnet. А именно файлы подобныеappsettings.staging.json,appsettings.production.json - Переопределяйте значения через переменные окружения — это полезно для деплоя (например, в Docker).
- Комбинируйте источники — можно загружать конфигурацию из файла и переопределять часть значений через env-переменные.
- Использование опциональных полей
- Использование префиксов для env-переменных
// Для конфига: } // Будет искать переменную: APP_A_B_FIELD=value
Заключение
В Rust нет "официального" способа работы с конфигурациями, но благодаря крейтам можно выбрать удобный подход:
dotenvy— простой способ загружать.envфайлы.envconfig— автоматический парсинг env-переменных в структуры.config-rs— мощный инструмент для сложных конфигураций с поддержкой множества форматов.
Выбор зависит от ваших потребностей: для маленьких проектов подойдет dotenvy + envconfig, а для больших — config-rs.
Я в своих проектах использую dotenvy и config-rs. По началу работал только с envconfig, но его функционала все таки не хватает для полноценной работы.
Надеюсь, эта статья поможет вам удобно работать с конфигурациями в Rust! 🚀