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.

27
demandé sur James A. Rosen 2011-02-09 21:29:14

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:

  1. un mapping, auquel cas il est fusionné dans le mapping parent.
  2. 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.)

15
répondu Jesse Beder 2016-03-17 10:49:26

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.

14
répondu yngve 2014-11-19 16:45:31

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

12
répondu sepp2k 2011-02-09 18:45:33

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.

1
répondu Wojtek Mach 2011-04-13 08:11:00

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.

0
répondu Eric Woodruff 2016-07-28 06:26:15