Таким образом, у меня есть два файла YAML, «A» и «B», и я хочу, чтобы содержимое A было вставлено в B, либо встроено в существующую структуру данных, например, массив, или как дочерний элемент элемента, например, значение для определенного ключа хеша.
Это вообще возможно? Как? Если нет, какие-либо указатели на нормативную ссылку?
yaml
transclusion
KCH
источник
источник
Ответы:
Нет, YAML не содержит каких-либо операторов «import» или «include».
источник
Ваш вопрос не требует Python-решения, но вот тот, который использует PyYAML .
PyYAML позволяет вам присоединять пользовательские конструкторы (такие как
!include
) к загрузчику YAML. Я включил корневой каталог, который можно настроить так, чтобы это решение поддерживало относительные и абсолютные ссылки на файлы.Основанное на классе решение
Вот решение на основе классов, которое позволяет избежать глобальной корневой переменной моего исходного ответа.
Посмотрите эту суть для аналогичного, более надежного решения Python 3, которое использует метакласс для регистрации пользовательского конструктора.
Пример:
foo.yaml
bar.yaml
Теперь файлы могут быть загружены с помощью:
источник
include
функции может быть упрощен: `def include (загрузчик, узел):" "" Включить другой файл YAML. "" "Filename = loader.construct_scalar (узел) data = yaml.load (open (filename))`a: bla
bar.yaml: `! Include foo.yaml b: blubb`, чтобы результат был:` {'a': bla, 'b': blubb}Если вы используете версию YAML от Symfony , это возможно, например так:
источник
Включения не поддерживаются напрямую в YAML, насколько я знаю, вам придется самостоятельно предоставить механизм, однако это обычно легко сделать.
Я использовал YAML в качестве языка конфигурации в своих приложениях на Python, и в этом случае часто определяю такое соглашение:
Затем в моем (Python) коде я делаю:
Единственным недостатком является то, что переменные во include всегда будут переопределять переменные в main, и нет никакого способа изменить этот приоритет, изменив положение, в котором в файле main.yml присутствует оператор "includes:".
С другой стороны, YAML не поддерживает include, поскольку он на самом деле не разработан так же эксклюзивно, как разметка на основе файлов. Что будет означать включение, если вы получите его в ответ на запрос AJAX?
источник
Для пользователей Python вы можете попробовать pyyaml-include .
устанавливать
использование
Считайте, что у нас есть такие файлы YAML :
1.yaml
содержание:2.yaml
содержание:Включить файлы по имени
На верхнем уровне:
Если
0.yaml
было:Мы получим:
В картировании:
Если
0.yaml
было:Мы получим:
В последовательности:
Если
0.yaml
было:Мы получим:
Включить файлы по шаблону
Имя файла может содержать подстановочные знаки в стиле оболочки. Данные, загруженные из файла (ов), найденных с помощью подстановочных знаков, будут установлены в последовательности.
Если
0.yaml
было:Мы получим:
Чтобы включить
recursive
аргумент, мы напишем!include
тег в режимеMapping
илиSequence
:Sequence
режиме:Mapping
режиме:источник
В продолжение ответа @ Josh_Bode, вот мое собственное решение PyYAML, преимущество которого состоит в том, что он является отдельным подклассом
yaml.Loader
. Это не зависит ни от глобальных значений уровняyaml
модуля , ни от изменения общего состояния модуля.источник
yaml.load(f, IncludeLoader)
внутри,_include
вы можете избежать замены рута. Кроме того, если вы не сделаете этого, решение не будет работать на глубине более одного уровня, поскольку включенные данные используют обычныйyaml.Loader
класс.root
изkwargs
после установки ,self.root
чтобы получить его работу со строками. Я переместил блок if-else надsuper
вызовом. Может быть, кто-то еще может подтвердить мои выводы или показать мне, как использовать класс со строками иroot
параметром.Я приведу несколько примеров для вашей справки.
вывод
Обновление 2
и вы можете комбинировать это, как это
источник
К сожалению, YAML не предоставляет этого в своем стандарте.
Но если вы используете Ruby, есть жемчужина, предоставляющая требуемую функциональность путем расширения библиотеки ruby YAML: https://github.com/entwanderer/yaml_extend
источник
Я думаю, что решение, используемое @ maxy-B, выглядит великолепно. Однако для меня это не удалось с вложенными включениями. Например, если config_1.yaml включает config_2.yaml, который включает config_3.yaml, возникла проблема с загрузчиком. Однако, если вы просто указываете новый класс загрузчика на себя при загрузке, он работает! В частности, если мы заменим старую функцию _include на слегка измененную версию:
Подумав, я согласен с другими комментариями, что вложенная загрузка не подходит для yaml в целом, поскольку входной поток может не быть файлом, но это очень полезно!
источник
Стандарт YML не определяет способ сделать это. И эта проблема не ограничивается YML. JSON имеет те же ограничения.
Многие приложения, использующие конфигурации на основе YML или JSON, в конечном итоге сталкиваются с этой проблемой. И когда это происходит, они составляют свое собственное соглашение .
например, для определения API Swagger:
например, для докера составьте конфигурации:
В качестве альтернативы, если вы хотите разделить содержимое файла yml на несколько файлов, например дерево содержимого, вы можете определить собственное соглашение о структуре папок и использовать (существующий) сценарий слияния.
источник
Может быть, это может вдохновить вас, попробуйте согласовать с JBB соглашения:
https://docs.openstack.org/infra/jenkins-job-builder/definition.html#inclusion-tags
- job: name: test-job-include-raw-1 builders: - shell: !include-raw: include-raw001-hello-world.sh
источник
Стандарт YAML 1.2 изначально не включает эту функцию. Тем не менее, многие реализации предоставляют некоторое расширение для этого.
Я представляю способ достижения этого с помощью Java и
snakeyaml:1.24
(библиотеки Java для синтаксического анализа / передачи файлов YAML), который позволяет создавать собственный тег YAML для достижения следующей цели (вы увидите, что я использую его для загрузки наборов тестов, определенных в нескольких файлах YAML). и что я заставил его работать как список включений для целевогоtest:
узла):Вот один класс Java, который позволяет обрабатывать
!include
тег. Файлы загружаются из classpath (каталог ресурсов Maven):источник
С помощью Yglu вы можете импортировать другие файлы, например так:
A.yaml
B.yaml
Как
$import
и функция, вы также можете передать выражение в качестве аргумента:Это даст тот же результат, что и выше.
Отказ от ответственности: я автор Yglu.
источник
С Symfony его обработка yaml косвенно позволит вам вкладывать файлы yaml. Хитрость заключается в том, чтобы использовать
parameters
опцию. например:common.yml
config.yml
Результат будет таким же, как:
источник
Возможно, это не было поддержано, когда был задан вопрос, но вы можете импортировать другой файл YAML в один:
Хотя у меня нет онлайн-ссылки, но это работает для меня.
источник
imports
.