Подтвердить что ты не робот

Есть ли способ для псевдонима/привязки массива в 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 есть только два элемента, поэтому было бы не слишком плохо дать каждому псевдоним и ссылку как в каждом пакете. Это хорошо для этого случая, но быстро становится недостижимым, когда есть пять или десять элементов, которые имеют определенный порядок загрузки.

4b9b3361

Ответ 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.