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.
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:
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.)
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.
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.
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.
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.