2011-02-09 14 views
23

Estoy usando Jammit para empacar activos para una aplicación de Rails y tengo algunos archivos de activos que me gustaría que se incluyeran en cada uno de los pocos grupos. Por ejemplo, me gustaría que Sammy y sus complementos estén en mis paquetes mobile y screen JS.¿Hay alguna manera de alias/anclar una matriz en YAML?

He intentado esto:

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

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

y esto:

mobile: 
    - *SAMMY 

pero tanto poner los archivos Sammy JS de una matriz anidada, que Jammit no puede entender. ¿Hay una sintaxis para incluir los elementos de una matriz directamente en otra matriz?

NB: Soy consciente de que en este caso sólo hay dos elementos en el SAMMY Array, por lo que no estaría tan mal en dar a cada uno un alias y referencia tanto en cada paquete. Eso está bien para este caso, pero se vuelve rápidamente inmanejable cuando hay cinco o diez elementos que tienen un orden de carga específico.

Respuesta

12

Su ejemplo es válido YAML (un lugar conveniente para verificar es YPaste), pero no está definido lo que hace la fusión. Según el spec, una clave de fusión puede tener un valor:

  1. Una asignación, en cuyo caso se fusiona en la asignación primaria.
  2. Una secuencia de asignaciones, en cuyo caso cada una se fusiona, una a una, en la asignación principal.

No hay forma de fusionar secuencias. Sin embargo, puedes hacer esto en el código. Usando el YAML de su segunda idea:

mobile: 
    - *SAMMY 

obtendrá secuencias anidadas - ¡así aplánelas! Suponiendo que haya una asignación de tales secuencias anidadas:

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

(Por supuesto, si usted tiene un archivo YAML más complicado, y no desea aplanado cada secuencia (o no lo son todas las secuencias), que Tendré que hacer un poco de filtrado.)

+0

Aquí hay un ejemplo: http://www.yaml.org/ypaste/803/index.html. Acabo de comprobar nuevamente y noté que no es un error de sintaxis, es que esta construcción no crea una matriz plana y; crea un mapa, que Jammit no puede manejar. Acabo de editar la pregunta para mostrar esto. –

+0

@James, lo siento, no me había dado cuenta de que estaban fusionando secuencias. Editado –

+0

Asegúrese de aplanar (1) para obtener un aplanamiento superficial para no destruir las matrices en los valores. – Costi

11

Si desea mobile para ser igual a sammy, sólo puede hacer:

mobile: *SAMMY 

Sin embargo, si usted quiere mobile que contienen otros elementos además de los de sammy, no hay manera de hacerlo en YAML según entiendo.

2

esto debería resolver su problema: http://pastie.org/1790173.

Tenga en cuenta que tuve que crear un grupo en blanco default (o como lo llame) en la parte superior.

+1

Esto no actúa de forma diferente al segundo intento del OP ('- * SAMMY'). La referencia se convierte en una matriz anidada. Aún así, debe aplanar la matriz primaria si no desea la anidación. – Kelvin

10

solución más cercano que conozco es éste:

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

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

Por otra parte, como ya se ha sugerido, aplanar las listas anidadas en un fragmento de código.

. Nota: de acuerdo con yaml-online-parser, su primera sugerencia no es un uso válido de < < (utilizado para fusionar las llaves de dos diccionarios El ancla entonces tiene que apuntar a otro diccionario Creo

0

Como lo ha sido. sugerido, cuando necesita aplanar una lista, al menos en ruby, es trivial agregar un especificador de tipo "aplanar" al móvil e implementar una clase que extienda Array, agregue el yaml_tag y aplana el codificador seq en init_with.

Cuestiones relacionadas