Cómo combinar archivos YAML

Author Top
enzo

Por definición, un YAML es un estándar de serialización de datos en un formato amigable para los humanos usado por muchos lenguages de programación. Perom en una definición menos formal YAML es un gran formato para los archivos de configuración, ya que los archivos YAML son tan expresivos como archivos XML y tan legible como archivos INI.

Actualmente, estoy usando archivos YAML de configuración en mis proyectos de Drupal, Silex y Symfony. Hasta ahora podría decir es una buena manera de guardar la información, pero no tengo una fuerte preferencia frente a otros formatos, sin embargo, es fácil de usar, así que no me arrepiento.

Sin embargo, un archivo YAML podría representar cualquier cosa, dejame mostrarte algunos ejemplos.

El primero hace parte del projecto Drupal console donde se utilizan archivos YAML para almacenar la cadena traducciones como se puede ver en Inglés y Español. Veamos un extracto de la traducción.

console:
    arguments:
        drupal: 'Ruta a la raíz de Drupal'
        shell: 'Iniciar el shell.'
        env: 'Nombre del ambiente.'
        no-debug: 'Desactivar el modo de depuración.'
        learning: 'Generar código con explicaciones.'
        generate-chain: 'Imprimir opciones y argumentos como YAML para ser usado el comando chain'
        generate-inline: 'Imprimir opciones y argumentos de ejecución como llamada inline para ser usados en el futuro'
        root: 'Define la raíz de Drupal que se utilizará en la ejecución de los comandos'
        uri: 'URI del sitio en Drupal que se usará (para ambientes en multi-site o cuando esta usando un puerto alternativo)'
    messages:
        completed: '¡Ya puede empezar a usar el código generado!'
        chain:
            generated: 'A continuación puedes observar la representación en YAML del último comando ejecutado, puede copiarlo en ~/.console/chain/sample.yml para ejecutarlo en una secuencia de comandos'
        inline:
            generated: 'A continuación puedes encontrar la representación inline de este comando para volver a ejecutarlo más tarde'
        generated: '¡Ya puedes empezar a usar el código generado!'
        files:
            generated: '¡Ya puedes comenzar a usar el código generado!'

El segundo ejemplo viene de Drupal, donde es utilizada por el componenete Configuration Management para la exportación e importación de configuraciónes a través de diferentes entornos. Déjame mostrarte un ejemplo de un tipo de contenido básico.

uuid: f5c966ac-b9a8-4ab8-b335-5380c6bb8524
name: drupal8.dev
mail: admin@example.com
slogan: ''
page:
  403: ''
  404: ''
  front: /node
admin_compact_mode: false
weight_select_max: 100
langcode: en
default_langcode: en

Ahora, con todos estos archivos YAML envueltos en nuestras aplicaciones, un nuevo tipo de tareas comunes y desafiantes aparecen.  

En el caso del proyecto Drupal console, ya que el proyecto está en desarrollo activo; nuevas características y correcciones se incluyen siempre en código base y sus traducción se distribuye en varios archivos YAML, estos archivos casí siempre estan muy por delante de sus traducciones, y tratar de actualizar de actualizarlas sin perder las traducciones hechas es un proceso lento y manual.

Como programadores, nosotros odiamos las tareas manuales y en este caso particular, siempre hemos dicho "Si sólo hubiera un comando o herramienta para realizar esta tonta tarea", así que me hice a mi mismo la la pregunta y mi respuesta fue incluir en el proyecto Drupal Console en el release 0.7.15 un nuevo comando yaml:merge.

Para ejecutar este comando, se necesitan al menos dos archivos YAML para fusiarnarlos, como se puede ver en la siguiente extracto.

$ drupal yaml:merge new.yml console.en.yml console.es.yml

Lo que pasará después de ejecutar este comando, es un nuevo archivo llamado new.yml que contendra todas las entradas del archivo console.en.yml y entradas traducidas en console.es.yml, de esta manera nueva traducciónes se mantendrán y nuevas entradas se incluirán en el nuevo archivo.

Es posible establecer el mismo archivo como último parámetro y destino para obtener una sobrescritura inmediata, pero se recomienda un nuevo archivo para comprobar los resultados.

Si es necesario se puede incluir mas de dos archivos YAML a fusionarse, pero debe tener en cuenta que los archivos YAML en el lado derecho siempre sobreescibiran sus entradas sobre los archivos a su izquierda.

El proyecto Drupal Console tiene este tipo de problemas, ya que hay diferentes fuentes de contribucion y diferente cantidad de contribuciones para cada lenguaje, pero en el futuro puedo visualizar que proyectos Drupal van a tener el mismo tipo de problemas cuando la misma pieza de configuración se actualiza en diferentes ambientes y tenemos la necesidad de fusiónarlos en una única solución.

Si no eres un usuario de Drupal console, pero que necesita este comando, no te preocupes si no tienes un entorno Drupal, Drupal Console es una aplicación Phar completamente independiente de Drupal. Para utilizar un comando como yaml:merge, simplemente instalala la Drupal Console, has tu trabajo y elimina la aplicación si no se requiere más.

Otros comandos disponibles para YAML files dentro de Drupal Console son:

yaml:update:value
yaml:update:key
yaml:split
yaml:diff

Espero que este articulo hay sido de su agrado.