2011-02-09 11 views
23

Używam Jammit do pakowania zasobów dla aplikacji Rails i mam kilka plików zasobów, które chciałbym dołączyć do każdej z kilku grup. Na przykład chciałbym, aby Sammy i jego wtyczki były w moich pakietach JS mobile i screen.Czy istnieje sposób na alias/kotwicę tablicy w YAML?

Próbowałem to:

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

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

i tak:

mobile: 
    - *SAMMY 

ale zarówno umieścić pliki Sammy JS w zagnieżdżonej tablicy, która Jammit nie może zrozumieć. Czy istnieje składnia do włączania elementów Array bezpośrednio w innym Array?

NB: Zdaję sobie sprawę, że w tym przypadku istnieją tylko dwa elementy w SAMMY Array, więc nie byłoby tak źle, aby każdy alias i odniesienie zarówno w każdym opakowaniu. W tym przypadku wszystko jest w porządku, ale szybko staje się niemożliwe do osiągnięcia, gdy istnieje pięć lub dziesięć elementów, które mają określoną kolejność ładowania.

Odpowiedz

12

Twój przykład to prawidłowy YAML (wygodnym miejscem do sprawdzenia jest YPaste), ale nie jest zdefiniowane, co robi scalenie. Według wartości spec klucz scalenia może mieć wartość:

  1. Mapowanie, w którym to przypadku jest scalane z mapowaniem macierzystym.
  2. Sekwencja mapowań, w którym to przypadku każdy jest scalany, jeden po drugim, w odwzorowaniu macierzystym.

Nie ma możliwości łączenia sekwencji. Możesz jednak zrobić to w kodzie. Używanie YAML z drugiego pomysłu:

mobile: 
    - *SAMMY 

dostaniesz zagnieżdżone sekwencje - więc spłaszcz je! Zakładając, że odwzorowanie takich zagnieżdżonych sekwencji:

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

(Oczywiście, jeśli masz bardziej skomplikowany plik YAML, a ty nie chcesz każda sekwencja spłaszczone (lub nie są one wszystkie sekwencje), ty Będę musiał trochę filtrować.)

+0

Oto przykład: http://www.yaml.org/ypaste/803/index.html. Właśnie sprawdziłem ponownie i zauważyłem, że to nie jest błąd składni, ale to, że ten konstrukt nie tworzy płaskiej arr y; tworzy mapę, której Jammit nie może obsłużyć. Właśnie zredagowałem pytanie, żeby to pokazać. –

+0

@ James, przepraszam, nie zdawałem sobie sprawy, że łączyłeś sekwencje. Edytowane. –

+0

Upewnij się, że spłaszczasz (1) w przypadku płytkiego spłaszczenia, aby nie zniszczyć tablic w wartościach. – Costi

11

Jeśli chcesz mobile być równa sammy, można po prostu zrobić:

mobile: *SAMMY 

Jednak jeśli chcesz mobile zawierać inne elementy oprócz tych w sammy, nie ma sposobu, aby to zrobić w YAML na tyle na ile wiem.

2

powinno to rozwiązać twój problem: http://pastie.org/1790173.

Zauważ, że musiałem utworzyć pustą grupę default (lub cokolwiek innego) na górze.

+1

To nie działa inaczej niż druga próba OP ('- * SAMMY'). Odwołanie staje się tablicą zagnieżdżoną. Nadal musisz spłaszczyć macierz nadrzędną, jeśli nie chcesz zagnieżdżenia. – Kelvin

10

Najbliższe rozwiązanie wiem jest to jedno:

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

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

Alternatywnie, jak już zasugerował, spłaszczyć zagnieżdżonych list w fragmencie kodu.

. Uwaga: zgodnie z yaml-online-parser, Twoja pierwsza propozycja nie jest poprawnym wykorzystanie < < (stosowane do łączenia klawiszy z dwóch słowników Kotwa ma następnie zwrócić się do innego słownika wierzę

0

Jak to było. zasugerował, że kiedy trzeba spłaszczyć listę, przynajmniej w rubinach, łatwo jest dodać specyfikator typu "! flatten" do wersji mobilnej i zaimplementować klasę, która rozszerza Array, dodaje yaml_tag i spłaszcza koder seq on init_with.