Зачем нужен YML-файл и как его создать
Что такое YML-файл и зачем он нужен магазинам: структура и основы синтаксиса. Чем отличается от XML: особенности формата. Как создать и загрузить на Яндекс.Маркет вручную: пошаговая инструкция с примерами. Как проверить файл на валидность и ошибки. Как нас
Рассказываем, зачем нужен YML-формат, чем отличается от XML и YAML, как делать такие файлы: вручную, с помощью CMS или сторонних сервисов, — а также как проверить файл на ошибки, загрузить его в кабинет продавца на Яндекс.Маркете и впоследствии обновить.
Что такое YML-файл и зачем он нужен
YML-файл (прайс-лист) — это документ с данными о товарах, которые вы планируете размещать на Яндекс.Маркете. Он создаётся с помощью собственного языка разметки Яндекса — YML (Yandex Market Language).
Логика работы такая: вы загружаете в кабинет файл, а Яндекс превращает его в каталог товаров с карточками, ценами, условиями доставки/самовывоза и прочим.
На Яндекс.Маркет можно загружать товары и в форматах CSV и XLS, но площадка отдаёт предпочтение именно YML: так файлы загружать удобнее и быстрее, поэтому мы рассказываем именно об этом формате.
Вот как выглядит YML-файл:
Сначала кажется, что создать YML‑файл сложно и это что‑то для программистов, но это не так. Главное — знать, какие там есть параметры и как их редактировать. Сейчас всё расскажем, и вы сможете повторить.
Чем YML отличается от XML
XML (eXtensible Markup Language) — расширяемый язык разметки. Он нужен для выделения логического содержимого документа для обработки. XML используется, например, в языках программирования: 1) SVG — для описания изображений в векторном формате; 2) в XAML — для описания интерфейсов приложений. И, конечно, XML — основа XHTML, благодаря чему мы видим страницы в интернете.
YML (Yandex Market Language) — собственный стандарт Яндекс.Маркета, основанный на XML. Он нужен именно для создания товаров в Яндекс.Маркете и работы с ними. YML использует синтаксис XML, но описывает исключительно товары и условия их размещения на Яндекс.Маркете.
YML не стоит путать с YAML. YAML (Yet Another Markup Language или YAML Ain’t Markup Language, «ещё один язык разметки» или «YAML — не язык разметки») — это формат хранения данных, похожий на язык разметки, но более удобный и с упрощённым синтаксисом.
YML также не имеет ничего общего с YMYL. YMYL — (Your Money or Your Life, «ваши деньги или ваша жизнь») — таким образом характеризуют контент на сайте, который может повлиять на здоровье, безопасность или финансовое благополучие людей, просматривающих этот сайт.
Из чего состоит YML‑файл
YML‑файлы в общем смысле делятся на 2 типа: такие, которые управляют товарами, и такие, которые управляют размещением (доставкой и самовывозом): у них есть общие элементы, а есть специализированные — для каждого типа свои.
Обязательные (общие) элементы
Это элементы, которые будут в любом YML‑файле.
Заголовок (шапка)
Занимает первую строку. Каждый файл должен начинаться именно с такой строки без каких‑либо изменений:
Если пользуетесь шаблоном для создания YML‑файлов, не меняйте эту строку. При создании своего файла с нуля просто скопируйте и вставьте эту строку в начало документа.
В нём указываются дата и время момента, в который актуальны данные в файле, а также часовой пояс.
Информация о магазине
Описывает основную информацию о вашем магазине, вкладывается в элемент .
В вкладываются следующие элементы:
Кошки
Параметры доставки
Этот элемент содержит в себе информацию о доставке — она описывается в конкретизирующих элементах . Используется только в файле, управляющем размещением.
Элементов может быть 5, каждый из них описывает один из способов доставки — например, обычную, ускоренную, на дом или до определённого пункта.
Параметры способа доставки задаются с помощью атрибутов:
- cost — это атрибут для технической проверки файла, он не используется для передачи какой‑то информации и не виден покупателям. Просто напишите в этом атрибуте любое целое число.
- days — атрибут, который рассказывает о том, за сколько дней будет осуществлена доставка. Минимум — 0 (если вы доставляете день в день), максимум — 60 дней. Если не указать этот атрибут, товар скроется с витрины: Яндекс не приемлет товары с неизвестным сроком доставки.
- order‑before — атрибут, показывающий, до которого часа нужно оформить заказ, чтобы срок доставки начал отсчитываться с текущего дня. Можно не указывать — его значение по умолчанию 13 (если будете указывать, то указывайте целое число от 0 до 24).
Выглядит сложно, но вы сможете разобраться. Вот так это выглядит в файле:
Здесь мы показали, что в одном способе доставки нужно заказать товар до 15:00, чтобы он был отправлен в этот же день, и доставка будет длиться 7 рабочих дней, а во втором — что заказать нужно до 12:00, и заказ будет доставлен за 3 дня.
Элемент
Параметры самовывоза
Здесь всё так же, как с параметрами доставки:
- внутри может быть до пяти элементов , описывающих разные способы самовывоза;
- параметры способа самовывоза так же, как и параметры доставки, задаются атрибутами cost (технический), days (срок, в который товар будет в ПВЗ) и order‑before.
- атрибут может быть вложен в для описания самовывоза для всего магазина и в для описания самовывоза конкретного товара.
❗️Элементы и нужны только в файлах, которые управляют размещением.
Ещё они нужны только тем магазинам, которые работают по модели DBS — это когда вы храните товары у себя на складе и доставляете их сами. Для двух других моделей — FBY (хранение на складе Маркета и доставка его силами) и FBS (хранение на вашем складе, доставка силами Маркета) — эти два элемента не актуальны.
Если ваш магазин не доставляет заказы покупателям или у него нет самовывоза, добавьте в файл такие строчки:
Пример полного YML‑файла
Хорошие примеры YML‑файлов обоих типов, сформированные корректно и с учётом всех особенностей площадки, у самого Яндекса. Вот они:
На основе этих файлов и описанных выше элементов с атрибутами и будем создавать свой файл для загрузки в Маркет.
Как создать YML‑файл
Вручную
Сначала нужно зарегистрироваться на портале для селлеров и добавить магазин.
Дальше нужно скачать один из шаблонов Яндекса по ссылкам выше и отредактировать в соответствии с типом файла: заполнить обязательные элементы (заголовок, корневой элемент, информация о магазине и офферах) и описать категории и параметры доставки и самовывоза в зависимости от магазина и его условий.
Через модули CMS
Сделать файл через CMS можно, только если вы используете одну из следующих систем:
- 1C‑Bitrix;
- InSales;
- WordPress;
- Shop‑Script;
- AdvantShop;
- NetCat;
- ReadyScript;
- UMI.CMS;
- Magento;
- Simpla;
- Okay CMS;
- Ecwid;
- Tilda Publishing.
Работают они все похожим образом: нужно скачать модуль для Яндекса, установить его и создать через него файл.
Для этого перейдите в «Настройки» → «Настройки API» и нажмите на «Интеграционные модули».

С помощью специальных сервисов
Таких сервисов на момент написания статьи мы нашли два:
Они работают просто: нужно добавить ссылку на свой сайт, сервис его проиндексирует и создаст на основе страниц файл нужного формата. Если вы знаете другие — напишите о них в комментариях.
Этот вариант пригодится тем, у кого много позиций, но нет интеграции с CMS. Однако этот вариант не идеальный: это может быть небезопасно, а файл может быть сформирован с ошибками.
Как проверить файл на ошибки
Сейчас у вас уже должен быть готовый файл.
Когда вы загрузите его в Маркет, площадка автоматически проверит его и пришлёт отчёт об ошибках, поэтому заранее проверять необязательно.

Но можно и проверить, например через XML‑валидатор фидов в Вебмастере (проверяет и YML‑файлы).
Загрузите файл и выберите схему проверки «Маркет»:

Возможные ошибки при загрузке файла
Когда вы проверите файл, вам могут быть показаны ошибки в нём: какие‑то из них критичны и влияют на размещение всего, что в каталоге, а какие‑то не очень важны для общей картины. Ошибки бывают нескольких типов:
- Критичные ошибки. Они затрагивают весь файл, поэтому их обязательно нужно исправить.
- Ошибки в предложениях. Это ошибки в конкретных товарах. Стоит исправить, иначе опубликуются только те товарные позиции, где всё верно.
- Общие ошибки. Эти ошибки касаются раздела , их лучше всего исправить. Файл с такими ошибками, скорее всего, опубликуется, но с неточностями в товарах.
- Предупреждения в предложениях. Этот тип означает, что есть ошибки в некоторых позициях: лучше всего исправить, но опубликуется всё, просто с неточностями.
- Рекомендации. Это советы по улучшению листа — можно прислушаться, можно не обращать внимания (но лучше прислушаться).
Как загрузить файл на Яндекс.Маркет
После проверки можно загружать файл в кабинет Маркета. Это можно сделать двумя способами: файлом и ссылкой.
Файлом
Файлом стоит загружать, если у вас нечасто обновляется ассортимент, потому что при каждом обновлении нужно снова загружать актуальный файл.
Перейдите в «Товары» → «Каталог» → «Загрузить файл».

Добавьте файл, он должен быть не более 100 Мб.

Можете указать, какие данные отражать, а какие нет.

Ссылкой
Ссылкой рекомендуется загружать, если у вас частые обновления. Робот будет проходить по ссылке каждые 30 минут и скачивать актуальный файл — вам нужно лишь обновлять информацию в нём.
Загрузите созданные файлы в любое облачное хранилище (Яндекс.Диск или Google Drive), откройте доступ по ссылке.
Перейдите в «Товары» → «Автообновление каталога» → «Добавить ссылку на файл».

Выберите тип загружаемого файла — тот, который управляет товарами, или тот, который нужен для управления размещениями. Вы можете загрузить оба файла, но это нужно будет делать по очереди.
Вставьте ссылку, она должна быть не длиннее 512 символов.

Здесь также можно выбрать, какая информация будет отражена в итоговом каталоге. А ещё можно указать логин и пароль от хранилища, на которое ведёт ссылка, если оно закрытое.

Как обновить файл
Каждый раз, когда в товарах или условиях их продажи появляется новая информация, нужно обновлять информацию в файле.
Если вы загружали файл напрямую в кабинет, нужно просто создать новый или отредактировать старый файл и загрузить его в кабинет заново.
Если вы загружали каталог ссылкой, вам нужно внести изменения в файл, на который ведёт ссылка, а робот Маркета при следующем считывании увидит изменения, и информация обновится.
Интересное по теме:
Как перевести в формат yml файл
What’s on this Page
.YAML вариант №
Файл YAML состоит из языка YAML (YAML не является языком разметки), который представляет собой язык сериализации данных на основе Unicode; используется для файлов конфигурации, обмена сообщениями в Интернете, сохранения объектов и т. д. YAML использует расширение .yaml для своих файлов. Его синтаксис не зависит от конкретного языка программирования. По сути, YAML предназначен для взаимодействия с человеком и хорошо работает с современными языками программирования. Поддержка сериализации произвольных собственных структур данных повысила читабельность файлов YAML, но немного усложнила процесс синтаксического анализа и генерации файлов.
Краткая история
YAML был впервые предложен в 2001 году и разработан Кларком Эвансом, Инги Дот Нет и Орен Бен-Кики. Сначала было сказано, что YAML означает «Еще один язык разметки», чтобы указать на его назначение в качестве языка разметки. Позже он был перепрофилирован как «YAML Aint Markup Language», чтобы указать его назначение как ориентированное на данные.
Формат файла YAML
Файл YAML состоит из следующих типов данных
- Скаляры: Скаляры — это такие значения, как строки, целые числа, логические значения и т. д.
- Последовательности: Последовательности представляют собой списки, в которых каждый элемент начинается с дефиса (-). Списки также могут быть вложенными.
- Mappings: Mapping дает возможность перечислить ключи со значениями.
Синтаксис
- Пробел: отступ пробела используется для обозначения вложенности и общей структуры.
«ямл Имя: Джон Смит контакт: домашний: 1012355532 офис: 5002586256 адрес: улица: | 123 Аллея Торнадо Люкс 16 город: Ист Сентервиль государство: КС
- **Комментарии**: Комментарии начинаются с символа «#». ``ямл # Это комментарий YAML
- Списки: Дефис (-) используется для обозначения элементов списка, где каждый элемент находится в отдельной строке. Члены списка также могут быть заключены в квадратные скобки ([…]), а элементы разделены запятыми (,).
``ямл [А, Б, С]
- Ассоциативный массив: ассоциативный массив заключен в фигурные скобки (). Ключи и значения разделяются двоеточием (:), а каждая пара разделяется запятой (,).
- **Строки**: Строка может быть записана с двойными (") или одинарными (') кавычками или без них. ``ямл Образец строки «Образец строки» «Образец строки»
- Содержимое скалярного блока: Скалярное содержимое можно записать в блочной записи, используя следующее:
- |: All live breaks are significant.
- >: Each line break is folded to space. It removes the leading whitespace for each line.
«ямл данные: | YAML (YAML не является языком разметки) это язык сериализации данных
``ямл данные: ? YAML (YAML не является языком разметки) это язык сериализации данных- Несколько документов: несколько документов разделяются тремя дефисами (—) в одном потоке. Дефисы обозначают начало документа. Дефисы также используются для отделения директив от содержимого документа. Конец документа обозначается тремя точками (…).
«ямл
Документ 1- **Тип**: для указания типа значения используются двойные восклицательные знаки (!!). ``ямл а: !! с плавающей запятой 123 б: !!стр 123- Тег: для назначения тега заметке используется амперсанд (&), а для ссылки на этот узел используется звездочка (*).
«ямл Имя: Джон Смит счет: &id01 улица: | 123 Аллея Торнадо Люкс 16 город: Ист Сентервиль государство: КС
адрес доставки: *id01
- **Директивы**: документам YAML могут предшествовать директивы в потоке. Директивы начинаются со знака процента (%), за которым следует имя, а затем параметры, разделенные пробелами. ``ямл %ЯМЛ 1.2 --- Содержание документаПример YAML-файла
Здесь вы можете увидеть пример файла docker yaml ниже:
topology: database_node_name: docker_controller docker_controller_node_name: docker_controller self_service_portal_node_name: docker_controller kvm_compute_node_names: kvm_compute1 docker_compute_node_names: docker_compute1YAML против JSON
По сути, и JSON, и YAML разработаны для обеспечения удобочитаемого формата обмена данными. YAML реализован как надмножество формата JSON. Это означает, что мы можем анализировать JSON с помощью парсера YAML. Хотя практическая реализация этой теории немного сложна. Поэтому некоторые основные различия между YAML и JSON приведены ниже:
YAML JSON Сложный и трудоемкий процесс анализа сериализованных данных Быстрый и простой анализ сериализованных данных JSON благодаря более простому дизайну Меньше поддержки сообщества Широкая поддержка и популярность сообщества Поддерживает комментарии Не поддерживает комментарии Возможность использовать ссылки на другие объекты данных Невозможно сериализовать сложные структуры со ссылками на объекты Иерархия обозначается двойным пробелом. Символы табуляции не допускаются Объекты и массивы обозначаются фигурными скобками и квадратными скобками. Строковые кавычки необязательны, но поддерживаются одинарные и двойные кавычки. Строки должны быть заключены в двойные кавычки. Корневой узел может быть любым допустимым типом данных Корневой узел должен быть либо массивом, либо объектом. Использованная литература
See Also
- YML — формат файла документа YAML
- Формат XVID-файла
- Формат файла КТ
- Формат файла CAF — основной аудиофайл
- Формат файла CAT — файл каталога Windows
YAML за 5 минут: синтаксис и основные возможности
YAML — это язык для сериализации данных, который используют DevOps и дата-сайентисты. Рассказываем про синтаксис YAML-файлов.
YAML — это язык для сериализации данных, который отличается простым синтаксисом и позволяет хранить сложноорганизованные данные в компактном и читаемом формате. Рассказываем, как это пригодится для DevOps и виртуализации.
- Что такое YAML?
- YAML vs JSON vs XML
- Характерные особенности YAML
- Синтаксис YAML
- Что ещё может YAML?
Что такое YAML?
YAML — это язык для хранения информации в формате понятном человеку. Его название расшифровывается как, «Ещё один язык разметки». Однако, позже расшифровку изменили на — «YAML не язык разметки», чтобы отличать его от настоящих языков разметки.
Язык похож на XML и JSON, но использует более минималистичный синтаксис при сохранении аналогичных возможностей. YAML обычно применяют для создания конфигурационных файлов в программах типа Инфраструктура как код (Iac), или для управления контейнерами в работе DevOps.
Чаще всего с помощью YAML создают протоколы автоматизации, которые могут выполнять последовательности команд записанные в YAML-файле. Это позволяет вашей системе быть более независимой и отзывчивой без дополнительного внимания разработчика.
Всё больше и больше компаний используют DevOps и виртуализацию, поэтому YAML — это must have для современного разработчика. Кроме того, YAML легко интегрировать, благодаря поддержке Python (используя PyYAML библиотеку, Docker или Ansible) и других популярных технологий.
YAML vs JSON vs XML
YAML (.yml)
- понятный человеку код;
- минималистичный синтаксис;
- заточен под работу с данными;
- встроенный стиль, похожий на JSON (YAML является его надмножеством);
- поддерживает комментарии;
- поддерживает строки без кавычек;
- считается «чище», чем JSON;
- дополнительные возможности (расширяемые типы данных, относительные якоря и маппинг типов с сохранением порядка ключей).
Применение: YAML лучше всего подходит для приложений с большим объемом данных, которые используют DevOps конвейеры или виртуальные машины. Кроме того, улучшение читаемости данных пригодится в командах, где разработчики часто с ними взаимодействуют.
JSON
- труднее читать;
- явные, строгие требования к синтаксису;
- встроенный стиль, похожий на YAML (некоторые парсеры YAML могут читать JSON-файлы);
- нет комментариев;
- строкам нужны двойные кавычки.
Применение: JSON используется в веб-разработке — это лучший формат для сериализации и передачи данных через HTTP-соединение.
XML
- труднее читать;
- более многословный;
- действует как язык разметки, а YAML как язык для форматирования данных;
- больше возможностей чем у YAML, например атрибуты тегов;
- более жёсткая схема документа.
Применение: XML идеален для сложных проектов, которым требуется тонкий контроль над валидацией, схемой и пространством имён. Язык обладает плохой читаемостью, требует большей пропускной способности и ёмкости хранилища, но обеспечивает беспрецедентный контроль.
Характерные особенности YAML
Поддержка мультидокументов
Вы можете объединить несколько YAML-документов в один YAML-файл для облегчения организации файлов и парсинга данных.
Документы разделяются тремя дефисами (—):
--- player: playerOne action: attack (miss) --- player: playerTwo action: attack (hit) ---Поддержка комментариев
YAML позволяет добавлять комментарии после символа #, как в Python:
key: #Это однострочный комментарий - value line 5 #Это #многострочный комментарий - value line 13Легко читаемый синтаксис
В синтаксисе YAML-файлов используется система отступов, как в Python. Необходимо использовать пробелы, а не табуляцию, чтобы избежать путаницы.
Это избавляет от лишних символов, которые есть в JSON и XML (кавычки, скобки, фигурные скобки).
В итоге читаемость файла значительно повышается.
YAML
#YAML Imaro: author: Charles R. Saunders language: English publication-year: 1981 pages: 224JSON
Явная и неявная типизация
YAML предлагает как автоопределение типов, так и возможность явно указать тип данных. Чтобы использовать конкретный тип, нужно написать !![тип] перед значением.
# Это значение преобразуется в int: is-an-int: !!int 14.10 # Превращает любое значение в строку: is-a-str: !!str 67.43 # Значение должно быть boolean: is-a-bool: !!bool yesОтсутствие исполняемых файлов
YAML не содержит исполняемых файлов. Поэтому можно безопасно обмениваться YAML-файлами с третьей стороной.
Чтобы использовать исполняемые файлы, YAML нужно интегрировать с другими языками, например Perl или Java.
Синтаксис YAML
В языке есть несколько базовых концепций, которые позволяют обрабатывать большинство данных.
Пары ключ-значение
Большинство данных в YAML-файле хранятся в виде пары ключ-значение, где ключ — это имя пары, а значение — связанные данные.
Скаляры и маппинг
Скаляр представляет собой одно значение, которому соответствует имя.
YAML поддерживает стандартные типы: int и float, boolean, string и null.
Они могут быть представлены в разных видах: шестнадцатеричном, восьмеричном или экспоненциальном. Также существуют специальные типы для математических сущностей, такие как: бесконечность, -бесконечность и NAN.
integer: 25 hex: 0x12d4 #равно 4820 octal: 023332 #равно 9946 float: 25.0 exponent: 12.3015e+05 #равно 1230150.0 boolean: Yes string: "25" infinity: .inf # преобразуется в бесконечность neginf: -.Inf #преобразуется в минус бесконечность not: .NAN #Not a Number null: ~Строки
Строка — это коллекция символов, которая может содержать слово или предложение. Можно использовать либо |, для отдельных строк, либо >, для параграфов.
Кавычки в YAML не нужны.
str: Hello World data: | Это Отдельные Строки data: > Это один параграф текстаПоследовательности
Последовательности — это структуры данных похожие на списки или массивы, которые хранят несколько значений под одним ключом. Они определяются с помощью отступов или [].
shopping: - milk - eggs - juiceОднострочные последовательности выглядят лаконичнее, но хуже читаются.
shopping: [milk, eggs, juice]Словари
Словари — это коллекции пар ключ-значение, которые хранятся под одним ключом. Они позволяют разделить данные на логические категории.
Employees: - dan: name: Dan D. Veloper job: Developer team: DevOps - dora: name: Dora D. Veloper job: Project Manager team: Web SubscriptionsСловари могут содержать более сложные структуры, что позволяет хранить сложные реляционные данные.
Что ещё может YAML?
- Anchors (якоря)
- Templates (шаблоны)
- Взаимодействие с Docker, Ansible и т. д.
- Расширенные последовательности и маппинг.
- Расширенные типы данных (timestamp, null и т. д.)
10 шагов к YAML-дзену
Мы все любим Ansible, но Ansible – это YAML. Для конфигурационных файлов существует масса форматов: списки значений, пары «параметр-значение», INI-файлы, YAML, JSON, XML и множество других. Однако по нескольким причинам из всех них YAML часто считается особенно трудным. В частности, несмотря на его освежающий минимализм и впечатляющие возможности для работы с иерархическими значениями, синтаксис YAML может раздражать своим Python-образными подходом к отступам.

Если вас бесит YAML, вы можете – и должны! – предпринять 10 следующих шагов, чтобы снизить свое раздражение до приемлемого уровня и полюбить YAML. Как и положено настоящему списку, наша десятка советов будет нумероваться с нуля, медитацию и духовные практики добавляем по желанию 😉
0. Заставьте ваш редактор работать
Неважно, какой у вас текстовый редактор – для него наверняка существует хотя бы один плагин для работы с YAML. Если у вас такого нет, немедленно найдите и установите. Потраченное на поиск и настройку время будет многократно окупаться каждый раз, когда вам придется редактировать YAML.
Например, редактор Atom поддерживает YAML по умолчанию, а вот для GNU Emacs придется установить дополнительные пакеты, например, yaml-mode.

Emacs в режиме YAML и отображения пробелов.
Если в вашем любимом редакторе нет режима YAML, то часть проблем можно решить, поработав с настройками. Например, штатный для GNOME текстовый редактор Gedit не имеет режима YAML, но по умолчанию подсвечивает синтаксис YAML и позволяет настроить работу с отступами:

Настройка отступов в Gedit.
А плагин drawspaces для Gedit отображает пробелы в виде точек, устраняя неясности с уровнями отступа.
Иными словами, потратьте время на изучение своего любимого редактора. Выясните, что он сам или его сообщество разработки предлагают для работы с YAML, и используйте эти возможности. Вы точно об этом не пожалеете.
1. Используйте линтер (linter)
В идеале языки программирования и языки разметки используют предсказуемый синтаксис. Компьютеры хорошо справляются с предсказуемостью, поэтому еще в 1978 году возникла концепция линтера. Если за 40 лет своего существования она прошла мимо вас и вы до сих пор не пользуетесь YAML-линтером, то самое время попробовать yamllint.
Установить yamllint можно с помощью штатного менеджера пакетов Linux. Например, в Red Hat Enterprise Linux 8 или Fedora это делается так:
$ sudo dnf install yamllintЗатем вы просто запускаете yamllint, передавая ему YAML-файл для проверки. Вот как это выглядит, если передать линтеру файл с ошибкой:
$ yamllint errorprone.yaml errorprone.yaml 23:10 error syntax error: mapping values are not allowed here 23:11 error trailing spaces (trailing-spaces)Цифры слева – это не время, а координаты ошибки: номер строки и столбца. Описание ошибки может вам ни о чем не говорить, зато вы точно знаете, где она находится. Просто посмотрите на это место в коде, и, скорее всего, все станет ясно.
Когда yamllint не находит ошибок в файле, на экран ничего не выводится. Если вас пугает такая тишина и хочется немного больше обратной связи, то можно запускать линтер с условной командой echo через двойной амперсанд (&&), вот так:
$ yamllint perfect.yaml && echo "OK" OKВ POSIX двойной амперсанд срабатывает тогда и только тогда, когда предшествующая команда возвращает 0. А yamllint как раз возвращает количество найденных ошибок, поэтому вся эта условная конструкция и работает.
2. Пишите на Python, а не на YAML
Если вас реально бесит YAML, просто не пишите на нем, в буквальном смысле. Бывает, что YAML – это единственный формат, который воспринимается приложением. Но и в этом случае необязательно создавать YAML-файл. Пишите на том, что вам нравится, а потом конвертируйте. Например, для Python есть отличная библиотека pyyaml и целых два способа конвертирования: самоконвертирование и конвертирование через скрипты.
Самоконвертирование
В этом случае файл с данными заодно является и Python-скриптом, который генерирует YAML. Этот способ лучше всего подходит для небольших наборов данных. Вы просто пишите JSON-данные в переменную Python, предваряете это директивой import, а в конце файла добавляете три строчки для реализации вывода.
#!/usr/bin/python3 import yaml d=< "glossary": < "title": "example glossary", "GlossDiv": < "title": "S", "GlossList": < "GlossEntry": < "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": < "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] >, "GlossSee": "markup" > > > > > f=open('output.yaml','w') f.write(yaml.dump(d)) f.closeТеперь запускаем это файл на Python-е и на выходе получаем файл output.yaml:
$ python3 ./example.json $ cat output.yaml glossary: GlossDiv: GlossList: GlossEntry: Abbrev: ISO 8879:1986 Acronym: SGML GlossDef: GlossSeeAlso: [GML, XML] para: A meta-markup language, used to create markup languages such as DocBook. GlossSee: markup GlossTerm: Standard Generalized Markup Language ID: SGML SortAs: SGML title: S title: example glossaryЭто абсолютно корректный YAML, но yamllint выдаст предупреждение, что он не начинается с —. Что ж, это можно легко поправить вручную или слегка доработать Python-скрипт.
Конвертирование через скрипты
В этом случае сначала пишем на JSON-е, а затем запускаем конвертор в виде отдельного Python-скрипта, который на выходе дает YAML. По сравнению с предыдущим этот способ лучше масштабируется, поскольку конвертирование отделено данных.
Для начала создадим JSON-файл example.json, например, его можно взять на json.org:
< "glossary": < "title": "example glossary", "GlossDiv": < "title": "S", "GlossList": < "GlossEntry": < "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": < "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] >, "GlossSee": "markup" > > > > >Затем создадим простой скрипт-конвертор и сохраним его под именем json2yaml.py. Этот скрипт импортирует оба модуля — YAML и JSON Python, а также загружает указанный пользователем файл JSON, выполняет конвертирование и пишет данные в файл output.yaml.
#!/usr/bin/python3 import yaml import sys import json OUT=open('output.yaml','w') IN=open(sys.argv[1], 'r') JSON = json.load(IN) IN.close() yaml.dump(JSON, OUT) OUT.close()Сохраните этот скрипт в system path и запускайте по мере необходимости:
$ ~/bin/json2yaml.py example.json3. Парсите много и часто
Иногда на проблему полезно взглянуть под другим углом. Если вам трудно представить взаимосвязи между данными в YAML, можно временно преобразовать их в нечто более привычное.
Например, если вам удобно работать со словарными списками или с JSON, то YAML можно преобразовать в JSON всего двумя командами в интерактивной оболочке Python. Допустим, у вас есть YAML-файл mydata.yaml, тогда вот как это будет выглядеть:
$ python3 >>> f=open('mydata.yaml','r') >>> yaml.load(f) >, 'words': 938, 'comments': 'Good article. Could be better.'>На эту тему можно найти массу других примеров. Кроме того, в наличии множество онлайн-конвертеров и локальных парсеров. Так что не стесняйтесь переформатировать данные, когда видите в них только непонятную мешанину.
4. Читайте спеки
Возвращаясь к YAML после долгого перерыва, полезно зайти на yaml.org и перечитать спецификации (спеки). Если у вас трудности с YAML, но до спецификации руки так и не дошли, то пора эту ситуацию исправлять. Спеки на удивление легко написаны, а требования к синтаксису иллюстрируются большим количеством примеров в Главе 6.
5. Псевдоконфиги
При написании книги или статьи всегда полезно сперва набросать предварительный план, хотя бы в виде оглавления. Так же и с YAML. Скорее всего, вы представляете, какие данные надо записать в файл YAML, но не очень понимаете, как связать их друг с другом. Поэтому прежде чем ваять YAML, нарисуйте псевдоконфиг.
Псевдоконфиг похож на псевдокод, где не надо заботиться о структуре или отступах, отношениях «родитель-потомок», наследовании и вложенности. Так и здесь: вы рисуете итерации данных по мере того, как они возникают у вас в голове.

Псевдоконфиг с перечислением программистов (Martin и Tabitha) и их навыков (языков программирования: Python, Perl, Pascal и Lisp, Fortran, Erlang, соответственно).
Нарисовав псевдоконфиг на листе бумаги, внимательно проанализируйте его и, если все в порядке, оформите в виде валидного YAML-файла.
6. Дилемма «табуляция или пробелы»
Вам придется решить дилемму «табуляция или пробелы?». Не в глобальном смысле, а лишь на уровне вашей организации, или хотя бы проекта. Неважно, будет ли при этом использоваться пост-обработка скриптом sed, настройка текстовых редакторов на машинах программистов или же поголовное взятие расписок о строгом соблюдении указаний линтера под угрозой увольнения, но все члены вашей команды, которые так или иначе касаются YAML, в обязательном порядке должны использовать только пробелы (как того требует спецификация YAML).
В любом нормальном текстовом редакторе можно настроить автозамену табуляции на заданное количество пробелов, поэтому бунта приверженцев клавиши Tab можно не бояться.
Как хорошо известно каждому ненавистнику YAML, на экране не видно разницы между табуляцией и пробелами. А когда чего-то не видно, об этом, как правило, вспоминают в последнюю очередь, после того, как перебрали, проверили и устранили все остальные возможные проблемы. Час времени, убитый на поиск кривой табуляции или блока пробелов, просто вопиет о том, что вам над срочно создать политику использования того или другого, а затем реализовать железобетонную проверку ее соблюдения (например, через Git-хук для принудительного прогона через линтер).
7. Лучше меньше да лучше (или больше – это меньше)
Некоторые люди любят писать на YAML, поскольку он подчеркивает структуру. При этом они активно используют отступы, чтобы выделять блоки данных. Это такое своего рода жульничество для имитации языков разметки, в которых используются явные разделители.
Вот пример такой структурированности из документации Ansible:
# Employee records - martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlangКому-то такой вариант помогает разложить в голове структуру YAML, других он наоборот раздражает массой ненужных, на их взгляд, отступов.
Но если вы являетесь владельцем YAML-документа и отвечаете за его сопровождение, то вы и только вы должны определять, как использовать отступы. Если вас раздражают большие отступы, сведите их к минимуму, который только возможен согласно спецификации YAML. Например, вышеприведенный файл из документации Ansible без каких бы то ни было потерь можно переписать вот так:
--- - martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlang8. Используйте заготовки
Если при заполнении файла YAML вы постоянно повторяете одни и те же ошибки, имеет смысл вставить в него шаблон-заготовку в виде комментария. Тогда в следующий раз можно будет просто скопировать эту заготовку и вписать туда реальные данные, например:
--- # - : # name: Given Surname # job: JOB # skills: # - LANG - martin: name: Martin D'vloper job: Developer skills: - python - perl - pascal - tabitha: name: Tabitha Bitumen job: Developer skills: - lisp - fortran - erlang9. Используйте что-то другое
Если приложение не держит вас мертвой хваткой, то, возможно, стоит сменить YAML на другой формат. Со временем конфигурационные файлы могут перерастать себя и тогда лучше преобразовать их в простые скрипты на Lua или Python.
YAML – отличная штука, которую многие любят за минимализм и простоту, но это далеко не единственный инструмент в вашем арсенале. Так что иногда от него можно отказаться. Для YAML легко найти библиотеки парсинга, поэтому, если вы предложите удобные варианты миграции, ваши пользователи относительно безболезненно переживут такой отказ.
Если же без YAML никак не обойтись, то возьмите на вооружение эти 10 советов и победите свою неприязнь к YAML раз и навсегда!
- Блог компании Red Hat
- Open source
- Разработка под Linux
- DevOps
- Лайфхаки для гиков
