webentwicklung-frage-antwort-db.com.de

Gibt es eine Möglichkeit, ein Array in YAML zu aliasen/verankern?

Ich verwende Jammit , um Assets für eine Rails-Anwendung zu packen, und ich habe ein paar Asset-Dateien, die ich gerne in jede der wenigen Gruppen aufnehmen möchte. Zum Beispiel möchte ich, dass Sammy und seine Plugins in meinen JS-Paketen mobile und screen enthalten sind.

Ich habe es versucht:

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

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

und das:

mobile:
  - *SAMMY

aber beide haben die Sammy-JS-Dateien in einem verschachtelten Array abgelegt, was Jammit nicht verstehen kann. Gibt es eine Syntax, um die Elemente eines Arrays direkt in ein anderes Array aufzunehmen?

NB: Mir ist klar, dass es in diesem Fall nur zwei Elemente im Array SAMMY gibt. Es wäre also nicht schlecht, jedem einen Alias ​​und einen Verweis auf beide in jedem Paket zu geben. Das ist in diesem Fall in Ordnung, wird aber schnell nicht mehr aufrechtzuerhalten, wenn fünf oder zehn Elemente eine bestimmte Ladereihenfolge haben.

29
James A. Rosen

Ihr Beispiel ist gültiges YAML (ein geeigneter Ort zum Überprüfen ist YPaste ), aber es ist nicht definiert, was die Zusammenführung bewirkt. Gemäß der Spezifikation kann ein Zusammenführungsschlüssel einen Wert haben:

  1. Eine Zuordnung, in diesem Fall wird sie mit der übergeordneten Zuordnung zusammengeführt.
  2. Eine Folge von Zuordnungen, von denen jede einzeln in die übergeordnete Zuordnung eingefügt wird.

Es gibt keine Möglichkeit, Sequenzen zusammenzuführen. Sie können dies jedoch im Code tun. Verwenden Sie die YAML aus Ihrer zweiten Idee:

mobile:
  - *SAMMY

sie erhalten verschachtelte Sequenzen - also drücken Sie sie flach! Angenommen, Sie haben eine Zuordnung solcher verschachtelter Sequenzen:

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

(Wenn Sie eine kompliziertere YAML-Datei haben und nicht jede Sequenz reduziert werden soll (oder nicht alle Sequenzen), müssen Sie einige Filterungen durchführen.)

16
Jesse Beder

Die nächste Lösung, die ich kenne, ist diese:

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

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

Alternativ können Sie, wie bereits vorgeschlagen, die verschachtelten Listen in einem Code-Snippet reduzieren.

Hinweis: Laut yaml-online-parser ist Ihr erster Vorschlag keine gültige Verwendung von << (zum Zusammenführen von Schlüsseln aus zwei Wörterbüchern. Der Anker muss dann auf ein anderes Wörterbuch verweisen, glaube ich.

18
yngve

Wenn mobile gleich sammy sein soll, können Sie einfach Folgendes tun:

mobile: *SAMMY

Wenn Sie jedoch möchten, dass mobile zusätzlich zu den Elementen in sammy weitere Elemente enthält, können Sie dies meines Wissens in YAML nicht tun.

14
sepp2k

dies sollte Ihr Problem lösen: http://pastie.org/1790173 .

Beachten Sie, dass ich oben eine leere default (oder wie auch immer Sie sie nennen) Gruppe erstellen musste.

1
Wojtek Mach

Wie bereits vorgeschlagen, ist es, wenn Sie eine Liste zumindest in Ruby reduzieren müssen, trivial, einen "! Flatten" -Typ-Bezeichner zu mobile hinzuzufügen und eine Klasse zu implementieren, die Array erweitert, das yaml_tag hinzufügt und die Codiersequenz reduziert init_with.

0
Eric Woodruff