Кратко
СкопированоYAML (YAML Ain't Markup Language или Yet Another Markup Language) — человекопонятный язык для хранения структурированной информации. Используется для написания конфигов, чтобы стартовать проект, проверять тесты и для линтеров.
Расширение файла может быть .yaml или .yml — это всё YAML.
Как пишется
СкопированоРазберём на примере как будет выглядеть вариант конфигурации питомца на YAML. Определим питомцу:
- Имя, которое впоследствии лучше заменить на реальное имя любимца.
- Категории его пушистости и возможные звуки которые он издаёт.
- Количество прекрасных лапок.
- Время, которое питомец тратит на обед.
bestCatConfiguration: # TODO: Вписать имя своего питомца name: "insertYourCatName" # Тут пример комментария isFluffy: true sounds: - "mur" - "pur" - "miau" paws: 4 lunchTime: 9.99
bestCatConfiguration: # TODO: Вписать имя своего питомца name: "insertYourCatName" # Тут пример комментария isFluffy: true sounds: - "mur" - "pur" - "miau" paws: 4 lunchTime: 9.99
В качестве отступов используются пробелы. Табы не допускаются, потому что иерархия в файле обозначается двойным пробелом. Поэтому лучше настроить себе линтер на проверку и правку. Пара похожа на JSON и работает по принципу ключ-значение. Определяем ключ и разделяем его со значением символом :
. После двоеточия следует значение.
В коде можно использовать комментарии. Их определяем через символ #
и после него пишем текст комментария.
Структуры данных, которые нам доступны в YAML
СкопированоСтроки
СкопированоМожно использовать с кавычками и без, в одно и несколько слов. Все в вашей власти! Ниже примеры:
Без лишних кавычек:
name: insertYourCatName
name: insertYourCatName
Вариант с несколькими словами:
name: insert Your Cat Name
name: insert Your Cat Name
С использованием двойных или одинарных кавычек (в данном случае двойные):
name: "insertYourCatName"
name: "insertYourCatName"
Числа
СкопированоМожно использовать целые числа или значения с плавающей точкой. Для дробных чисел можно использовать только точку для разделения, потому что при использовании запятой YAML посчитает значение как строку. Например:
Целое число:
paws: 4
paws: 4
Число с плавающей точкой:
# кот всегда говорит что ему не доложили порциюlunchTime: 2.99
# кот всегда говорит что ему не доложили порцию lunchTime: 2.99
Списки/массивы
СкопированоМассивы и списки используют для перечисления данных.
В YAML описывать списки можно двумя способами:
Как массив:
sounds: ["mur", "pur", "miau"]
sounds: ["mur", "pur", "miau"]
Как список:
sounds: - "mur" - "pur" - "miau"
sounds: - "mur" - "pur" - "miau"
Якорь или ссылочная переменная
СкопированоЯкорь — это приспособление для создания переменных, на которые можно ссылаться. Якорь позволяет вынести повторяющиеся части конфига и использовать ссылку на них в других местах. Так мы можем уменьшить дублирование кода.
Чтобы обозначить якорь используем символ &
. Чтобы задать значение ссылочной переменной, нужно использовать символ *
. Символы <<
показывают что мы просто вставим элементы без привязки к значению ключа.
Зададим базовую конфигурацию питомца с крутым котячьим именем и прекрасным возрастом в два года. Далее прописываем код <<
в конфигурации. Это означает, что мы заполняем поля базовыми значениями. Обращаю внимание на то, что если у нас уже определено поле, то базовая конфигурация туда не пропишется. Следовательно, у второго кота будет его гордый возраст в семь лет.
base: &base name: cool cat name age: 2cat1: &cat1# Добавляем все значения из base: <<: *basecat2: &cat2 <<: *base # «Перезаписываем» значение для поля `age`: age: 7
base: &base name: cool cat name age: 2 cat1: &cat1 # Добавляем все значения из base: <<: *base cat2: &cat2 <<: *base # «Перезаписываем» значение для поля `age`: age: 7
Во что превратится наш код:
cat1: name: cool cat name age: 2cat2: name: cool cat name age: 7
cat1: name: cool cat name age: 2 cat2: name: cool cat name age: 7
На практике
Скопированосоветует Скопировано
YAML vs JSON
СкопированоПреимущества YAML в том, что мы можем использовать комментарии. В JSON они нам не доступны.
Корневым узлом в JSON может быть только объект или массив. YAML даёт полную свободу и разрешает использовать любой из допустимых типов данных как корневой узел.
Например, JSON:
{ "demo": "demo text"}
{ "demo": "demo text" }
А вот YAML с той же информацией:
demo: "demo text"
demo: "demo text"
Иерархия в файле YAML обозначается двойными пробелами, а в JSON объекты и массивы обозначаются фигурными и квадратными скобками соответственно.
Приятной особенностью YAML является возможность не использовать кавычки для строк. Это не обозначает, что они не поддерживаются. Всё, как и указано выше — строки можно обозначать и кавычками, и без. У JSON политика жёстче — строки должны быть в двойных кавычках.
Использование YAML на примере Github Action
СкопированоОдин из способов использования — это настройка Github Actions. Это очень полезная штука, которая позволяет проверять пулреквесты по заданным в YAML-конфигах правилам.
Если в правилах описать запуск линтера и тестов в ответ на событие в репозитории (например, pull-request), то они будут запускаться каждый раз при появлении этого события. Так мы можем оградить главную ветку репозитория от сломанного кода.
Базовый список для минимального action это имя, в каком случае он будет выполняться (на какое событие), где запускать (операционная система) и шаги которые необходимо выполнить.
name: GitHub Actions Exampleon: [pull_request]jobs: Explore-GitHub-Actions: runs-on: ubuntu-latest steps: - run: echo "Ура! Я запустился на ${{ github.event_name }}." - run: echo "Я работаю на ОС - ${{ runner.os }}"
name: GitHub Actions Example on: [pull_request] jobs: Explore-GitHub-Actions: runs-on: ubuntu-latest steps: - run: echo "Ура! Я запустился на ${{ github.event_name }}." - run: echo "Я работаю на ОС - ${{ runner.os }}"
В экшенах можно пользоваться переменными, например, операционная система ${{ runner
описана выше одноимённым ключом runs
и мы получим значение Linux. В случае ${{ github
выведет значение ключа on
— pull
.