Есть ли способ псевдоним / якорь массив в YAML? - PullRequest
33 голосов
/ 09 февраля 2011

Я использую Jammit для упаковки ресурсов для приложения Rails, и у меня есть несколько файлов активов, которые я хотел бы включить в каждую из нескольких групп. Например, я бы хотел, чтобы Sammy и его плагины были в моих пакетах mobile и screen JS.

Я пробовал это:

sammy: &SAMMY
  - public/javascripts/vendor/sammy.js
  - public/javascripts/vendor/sammy*.js

mobile:
  <<: *SAMMY
  - public/javascripts/something_else.js

и это:

mobile:
  - *SAMMY

но оба помещают файлы Sammy JS во вложенный массив, который Джаммит не может понять. Существует ли синтаксис для включения элементов массива непосредственно в другой массив?

NB : Я понимаю, что в этом случае в массиве SAMMY есть только два элемента, так что было бы не так уж плохо давать каждому из них псевдоним и ссылку в каждом пакете. Это хорошо для этого случая, но быстро становится неуправляемым, когда есть пять или десять элементов, которые имеют определенный порядок загрузки.

Ответы [ 4 ]

22 голосов
/ 19 ноября 2014

Ближайшее решение, о котором я знаю, это:

sammy:
  - &SAMMY1
    public/javascripts/vendor/sammy.js
  - &SAMMY2
    public/javascripts/vendor/sammy*.js

mobile:
  - *SAMMY1
  - *SAMMY2
  - public/javascripts/something_else.js

В качестве альтернативы, как уже предлагалось, выровнять вложенные списки во фрагменте кода.

Примечание: в соответствии с yaml-online-parser ваше первое предложение не является допустимым использованием << (используется для объединения ключей из двух словарей. Якорь затем должен указывать на другой словарь, который я считаю . </p>

17 голосов
/ 09 февраля 2011

Ваш пример действителен YAML (удобное место для проверки - YPaste ), но не определено, что делает слияние.В соответствии с spec ключ объединения может иметь значение:

  1. Отображение, в этом случае оно объединяется с родительским отображением.
  2. Последовательность отображений, в этом случае каждый из них, один за другим, объединяется в родительское отображение.

Нет способа объединения последовательностей.Вы можете, однако, сделать это в коде.Используя YAML из вашей второй идеи:

mobile:
  - *SAMMY

вы получите вложенные последовательности - так сгладьте их!Предполагая, что у вас есть отображение таких вложенных последовательностей:

data = YAML::load(File.open('test.yaml'))
data.each_pair { |key, value| value.flatten! }

(Конечно, если у вас более сложный файл YAML, и вы не хотите, чтобы каждая последовательность была сглажена (или они не все последовательности), вам придется сделать некоторую фильтрацию.)

16 голосов
/ 09 февраля 2011

Если вы хотите, чтобы mobile был равен sammy, вы можете просто сделать:

mobile: *SAMMY

Однако, если вы хотите, чтобы mobile содержал другие элементы в дополнение к sammyНасколько я знаю, в YAML нет способа сделать это.

0 голосов
/ 28 июля 2016

Как уже было предложено, когда вам нужно сгладить список, по крайней мере, в ruby, добавить тривиальный тип "! Flatten" к мобильному устройству тривиально и реализовать класс, расширяющий Array, добавляет yaml_tag и выравниваеткодер seq на init_with.

...