La fusión de los hashes de los archivos de conf YAML
YAML es muy útil para escribir archivos de configuración. Principal ventaja es que, se lee como archivo de texto. Esto funciona muy bien si su fichero de configuración es plana (sin jerarquía) y no tiene repeticiones.
Si su archivo de configuración tiene repeticiones, entonces tiene sentido para separar los elementos y volver a usarlos. Lo que quiero decir es esto - digamos que su archivo de configuración es la siguiente:
el desarrollo: input_location: common_input output_location: dev_location mail: smtp_server: su_servidor de inicio de sesión: your_login contraseña: top_secret producción: input_location: common_input output_location: dev_location mail: smtp_server: su_servidor de inicio de sesión: your_login contraseña: top_secret
Suponiendo que el código anterior en / tmp / test.yml aquí es cómo se puede leer en Python y Ruby
$cat readyml.py
#! / Usr / bin / python env pprint de importación pprint como pp # Debian en el que instalar python-YAML de la carga de importación YAML, load_all, volcado hash = carga (open ('/ tmp / test.yml')) pp (hash ['desarrollo'])
$ cat readyml.rb
#! / Usr / bin / env ruby require 'pp' hash = YAML :: load (File.open ('/ tmp / test.yml'). leer) pp hash ['desarrollo']
aquí hay una mano un trazador de líneas de la versión de Ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' o puedes intentar lo mismo en el IRB o la consola de python.
Tenga en cuenta que en el fragmento de código anterior, todo es distinto de ubicación de salida es la misma en el desarrollo y la parte de producción. Aquí es donde identificador de nodo yml viene a rescatar. La idea es sencilla tiene un conjunto de valores predeterminados y reemplazar ellos en lugar diferente.
Usted podría separarla de la siguiente manera:
por defecto y por defecto: input_location: common_input output_location: dev_location mail: sender_name: emisor smtp_server: su_servidor de inicio de sesión: your_login contraseña: top_secret el desarrollo: <<: * Los valores por defecto producción: <<: * Los valores por defecto output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Grande, que funciona (tm)!.
Podría decirse que negocian un poco de claridad a un poco de magia. Aquí hay una pequeña explicación: &, * y <<: y que es etiqueta de anclaje puede ser entendido como identificador de nodo, * es la referencia de nodo y <<: es sinónimo de fusión de hash.
Para más detalles vea bien las especificaciones YAML o wikipedia
Hasta aquí todo bien, pero hay un problema aquí, estas fusiones hash no son recursivos. Lo que significa es lo siguiente: digamos que usted desea tener el nombre del remitente para el correo diferentes en dos ambientes, usted puede estar tentado a hacer lo siguiente:
por defecto y por defecto: input_location: common_input output_location: dev_location mail: sender_name: emisor smtp_server: su_servidor de inicio de sesión: your_login contraseña: top_secret el desarrollo: <<: * Los valores por defecto mail: sender_name: sender_dev producción: <<: * Los valores por defecto output_location: prod_location mail: sender_name: sender_prod
Permite comprobar
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Vaya, algo salió mal, el problema como se mencionó anteriormente es que la combinación hash no es recurrente y si bien la fusión de lo reemplazó de correo electrónico de forma predeterminada por correo de la producción que tiene una sola llave. Solución / es trabajo en torno a desenrollar un nivel más:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults sender_name: emisor smtp_server: su_servidor de inicio de sesión: your_login contraseña: top_secret por defecto y por defecto: <<: * Common_settings mail: <<: * Mail_defaults el desarrollo: <<: * Los valores por defecto producción: <<: * Los valores por defecto mail: <<: * Mail_defaults sender_name: sender_prod
Vamos a comprobar de nuevo
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
¿Sabía usted que usted tiene un nivel de más de anidación, así que definitivamente se puede desenrollar un nivel más, pero entonces se convierte en un desastre. Por lo tanto, si usted no está tratando de escribir la solución a las torres de Hanoi en un archivo de conf, es mejor restucture conf a cavar en YAML o alguna otra cosa. Pero eso es la llamada de todos modos.
Comentarios
- dogging
- søgemaskineoptimering
- Benjamin "balupton" Lupton



































