YAML vs TOML: какой формат конфигурации выбрать?
YAML и TOML — оба человекочитаемые форматы конфигурации, но они используют принципиально разные подходы. YAML использует отступы для структуры; TOML использует заголовки в INI-стиле и явный синтаксис ключ-значение. Правильный выбор зависит от вашего проекта, команды и экосистемы.
Сравнение синтаксиса
Одна и та же конфигурация в обоих форматах
YAML:
database:
host: localhost
port: 5432
name: myapp
ssl: true
pool:
min: 5
max: 20
server:
host: 0.0.0.0
port: 8080
workers: 4
cors:
origins:
- https://example.com
- https://api.example.com
TOML:
[database]
host = "localhost"
port = 5432
name = "myapp"
ssl = true
[database.pool]
min = 5
max = 20
[server]
host = "0.0.0.0"
port = 8080
workers = 4
[server.cors]
origins = [
"https://example.com",
"https://api.example.com"
]
Ключевые различия
| Характеристика | YAML | TOML |
|---|---|---|
| Структура | На основе отступов | Заголовки секций |
| Кавычки строк | Обычно необязательны | Всегда обязательны |
| Определение типов | Агрессивное (рискованно) | Явное |
| Комментарии | # (однострочные) | # (однострочные) |
| Многострочные строки | Блоки | и > | Блоки с тройными кавычками |
| Поддержка даты/времени | Строки ISO 8601 | Нативный тип datetime |
| Якоря/псевдонимы | Да | Нет |
| Глубина вложенности | Неограниченная (практически) | Неограниченная (многословно для глубокой) |
| Массив таблиц | Последовательность отображений | Синтаксис [[section]] |
| Спецификация | Большая, сложная | Маленькая, простая |
Типобезопасность
Проблема определения типов в YAML
YAML агрессивно определяет типы, вызывая трудноуловимые баги:
version: 1.0 # Float, not string "1.0"
country: NO # Boolean false, not string "NO"
port: '080' # Octal number 64, not string "080"
on: true # Boolean, not string "on"
Явные типы TOML
TOML требует явного синтаксиса, предотвращая путаницу с типами:
version = "1.0" # String (quotes required)
country = "NO" # String (quotes required)
port = "080" # String (quotes required)
on = true # Boolean (unambiguous)
TOML имеет нативные типы для даты и времени:
created = 2024-01-15 # DateTime (native type)
date-only = 2024-01-15 # Date
time-only = 10-30-00 # Time
Поддержка экосистем
YAML доминирует
- Docker Compose
- Kubernetes
- GitHub Actions
- Ansible
- CI/CD-пайплайны (CircleCI, GitLab CI, Travis CI)
- Облачные сервисы (AWS CloudFormation, Azure)
- Большинство DevOps-инструментов
TOML набирает обороты
- Rust (Cargo.toml)
- Python (pyproject.toml, PEP 518)
- Go (go.mod использует собственный формат, но TOML для конфигурации)
- Hugo (конфигурация сайта)
- Netlify
- pip (pyproject.toml)
JSON-конфигурация (для сравнения)
- Node.js (package.json, tsconfig.json)
- Настройки VS Code
- ESLint, Prettier
- Большинство инструментов JavaScript
Когда использовать YAML
- DevOps и инфраструктура: Kubernetes, Docker, CI/CD — экосистема этого требует
- Сложные вложенные структуры: YAML обрабатывает глубокую вложенность более естественно
- Повторное использование с якорями: DRY-конфигурация с якорями и псевдонимами
- Командная конвенция: если ваша команда уже активно использует YAML
Для работы с YAML наши инструменты YAML Formatter и YAML Validator незаменимы.
Когда использовать TOML
- Python-проекты: pyproject.toml — это стандарт
- Rust-проекты: Cargo.toml — это стандарт
- Простые конфигурации: плоские или неглубоко вложенные настройки
- Важна типобезопасность: явное кавычение TOML предотвращает путаницу с типами
- Новые проекты: если вы не ограничены экосистемой, TOML безопаснее для конфигурационных файлов
Когда не использовать ни один из них
- Машинно-генерируемая конфигурация: используйте JSON (самый быстрый парсинг, строжайший формат)
- Настройки приложений со схемами: используйте JSON с валидацией JSON Schema
- Обмен данными: используйте JSON для API, CSV для табличных данных
Часто задаваемые вопросы
Можно ли конвертировать между YAML и TOML?
Да, но с оговорками. Возможности YAML, такие как якоря, псевдонимы и сложные типы, не имеют эквивалента в TOML. Простые конфигурации с парами ключ-значение и вложенными структурами конвертируются без проблем. Инструменты вроде yj (YAML to JSON) в сочетании с toml-cli обрабатывают базовые конвертации.
Заменит ли TOML YAML?
Маловероятно. YAML слишком глубоко укоренился в экосистеме DevOps (Kubernetes, Docker, CI/CD). TOML набирает популярность для конфигурации приложений (Rust, Python), где типобезопасность важнее глубокой вложенности. Два формата, скорее всего, будут сосуществовать, каждый доминируя в своей экосистеме.
Связанные ресурсы
- YAML Formatter — форматирование YAML-файлов
- YAML vs JSON — ещё одно сравнение форматов
- Учебник по синтаксису YAML — основы YAML