Есть ли способ для псевдонима/привязки массива в YAML?
Я использую 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
есть только два элемента, поэтому было бы не слишком плохо дать каждому псевдоним и ссылку как в каждом пакете. Это хорошо для этого случая, но быстро становится недостижимым, когда есть пять или десять элементов, которые имеют определенный порядок загрузки.
Ответы
Ответ 1
Ваш пример действителен. YAML (удобное место для проверки YPaste), но он не определил, что делает слияние. В spec ключ слияния может иметь значение:
- Отображение, в этом случае оно объединяется в родительское сопоставление.
- Последовательность отображений, в каждом случае каждая из которых объединяется по одному в родительское сопоставление.
Нет способа слияния последовательностей. Вы можете, однако, сделать это в коде. Использование YAML из вашей второй идеи:
mobile:
- *SAMMY
вы получите вложенные последовательности - так сгладьте их! Предполагая, что у вас есть отображение таких вложенных последовательностей:
data = YAML::load(File.open('test.yaml'))
data.each_pair { |key, value| value.flatten! }
(Конечно, если у вас есть более сложный файл YAML, и вы не хотите, чтобы каждая последовательность сглаживалась (или они не все последовательности), вам нужно будет сделать некоторую фильтрацию.)
Ответ 2
Если вы хотите, чтобы mobile
был равен sammy
, вы можете просто:
mobile: *SAMMY
Однако, если вы хотите, чтобы mobile
содержал другие элементы в дополнение к тем, что находится в sammy
, я не могу сделать это в YAML, насколько мне известно.
Ответ 3
Ближайшее решение, о котором я знаю, это следующее:
sammy:
- &SAMMY1
public/javascripts/vendor/sammy.js
- &SAMMY2
public/javascripts/vendor/sammy*.js
mobile:
- *SAMMY1
- *SAMMY2
- public/javascripts/something_else.js
В качестве альтернативы, как уже было предложено, сгладьте вложенные списки в фрагменте кода.
Примечание: согласно yaml-online-parser, ваше первое предложение не является допустимым использованием < < (используется для слияния ключей из двух словарей. Затем привязка должна указывать на другой словарь, который я считаю.
Ответ 4
это должно решить вашу проблему: http://pastie.org/1790173.
Обратите внимание, что мне пришлось создать пустую группу default
(или что бы вы ее назвали).
Ответ 5
Как было предложено, когда вам нужно сгладить список, по крайней мере, в рубине, тривиально добавить спецификатор типа "! flatten" на мобильный и реализовать класс, который расширяет массив, добавляет yaml_tag и выравнивает coder seq на init_with.