Y a-t-il un moyen d'alias/ancrer un tableau dans YAML?
j'utilise Jammit package actifs pour une application Rails, et j'ai quelques fichiers d'actifs que j'aimerais être inclus dans chacune des quelques groupes. Par exemple, j'aimerais Sammy et ses plugins pour être dans mes deux mobile
et screen
paquets JS.
j'ai essayé ceci:
sammy: &SAMMY
- public/javascripts/vendor/sammy.js
- public/javascripts/vendor/sammy*.js
mobile:
<<: *SAMMY
- public/javascripts/something_else.js
et ça:
mobile:
- *SAMMY
mais les deux mettent les fichiers Sammy JS dans un tableau imbriqué, ce que Jammit ne peut pas comprendre. Est-il une syntaxe pour inclure les éléments d'un Tableau dans un autre Tableau?
NB: je me rends compte que dans ce cas il y a seulement deux éléments dans le SAMMY
Array, de sorte qu'il ne serait pas trop mal de donner à chacun un alias et une référence dans chaque paquet. C'est très bien pour ce cas, mais devient rapidement impossible à maintenir quand il ya cinq ou dix éléments qui ont un ordre de charge spécifique.
5 réponses
votre exemple est valide YAML (un endroit pratique à vérifier est YPaste), mais ce n'est pas défini ce que fait la fusion. Par le spec, une fusion peut avoir une valeur:
- un mapping, auquel cas il est fusionné dans le mapping parent.
- une séquence de mappages, auquel cas chacun est fusionné, un par un, dans le mappage parent.
mobile:
- *SAMMY
vous aurez des séquences imbriquées-alors aplatissez-les! En supposant que vous avez une cartographie de ces séquences imbriquées:
data = YAML::load(File.open('test.yaml'))
data.each_pair { |key, value| value.flatten! }
(bien sûr, si vous avez un fichier YAML plus compliqué, et que vous ne voulez pas que chaque séquence soit aplatie (ou ce ne sont pas toutes les séquences), vous devrez faire un peu de filtrage.)
la solution la plus proche que je connaisse est celle-ci:
sammy:
- &SAMMY1
public/javascripts/vendor/sammy.js
- &SAMMY2
public/javascripts/vendor/sammy*.js
mobile:
- *SAMMY1
- *SAMMY2
- public/javascripts/something_else.js
alternativement, comme déjà suggéré, aplatir les listes imbriquées dans un extrait de code.
Note:yaml-en-ligne-analyseur, votre première suggestion n'est pas valide l'utilisation de << (utilisé pour fusionner les clés de deux dictionnaires. L'ancre doit alors pointer vers un autre dictionnaire que je crois.
Si vous voulez mobile
pour être égal à sammy
, vous pouvez simplement faire:
mobile: *SAMMY
Toutefois, si vous voulez mobile
pour contenir d'autres éléments en plus de ceux
ceci devrait résoudre votre problème:http://pastie.org/1790173.
Note que j'ai eu à créer de vide default
(ou autre marque) groupe sur le dessus.
Comme il a été suggéré, lorsque vous avez besoin d'aplatir une liste, au moins en ruby, il est facile d'ajouter un "!aplatir le spécificateur de type " type à mobile et implémenter une classe qui étend Array, ajoute le yaml_tag et aplatit le codeur seq sur init_with.