Gestión de la configuración en Drupal 8

Una de las novedades mas celebradas de Drupal 8 ha sido sin duda la nueva gestión de la configuración. Es un concepto clave para trabajar con Drupal profesionalmente, y que no existía de forma nativa en Drupal 7.

Para ilustrar el problema, vamos a verlo con un ejemplo. En cualquier proyecto de desarrollo con Drupal que se precie lo normal es mantener varios entornos:

  • Desarrollo: Donde se llevan a cabo los cambios por los desarrolladores.
  • Producción: El entorno donde está publicada la versión real de la aplicación, a la que acceden los usuarios.
  • Opcionalmente: Entornos intermedios de integración o preproducción, testing, UAT, etc. 

Para no complicar mucho el ejemplo, pongamos que tan solo tenemos un entorno de desarrollo y otro de producción. Cuando un desarrollador crea una nueva funcionalidad,  se utiliza un entorno de desarrollo, y una vez la funcionalidad está completa y probada, se decide que es el momento de desplegarla en el entorno de producción. En algunos casos puede que sea tan sencillo como subir un módulo nuevo y listo, pero muchas veces nos encontraremos con la necesidad de crear elementos como vistas, o tipos de contenido, que ya tenemos en el entorno de desarrollo, pero que habría que crear de nuevo en el entorno de producción.

Aquí era donde empezaban los problemas con Drupal 7, ya que no había una forma nativa de exportar configuración, y aunque en algunos casos no nos llevaría mucho tiempo crear los componentes a mano en el otro entorno, no es una práctica nada recomendable, por mil razones, pero principalmente porque es fácil cometer errores y por la falta de un sistema de control de versiones que nos permita volver a un estado anterior.

Teníamos que usar el módulo Features, que aunque fué una bendición, no estaba exento de sus propios demonios, como problemas de sobreescritura (Overrides) en algunos componentes, Features que no se pueden revertir, dependencias y conflictos entre distintas Features, y un largo etcétera.

Además, en muchos casos cada módulo almacenaba la configuración como podía o quería. Una opción bastante común era usar variables, pero al final esa tabla era como un agujero negro donde cada módulo podía dejar cualquier cosa, ya que era fácil exportar después esas variables con Features y Strongarm, pero podía descontrolarse muy fácilmente. 

La nueva gestión de configuración que hace Drupal 8 pretende ayudar a solucionar todos esos problemas, y de momento parece que lo esta consiguiendo.

Para empezar, ahora cada módulo puede definir su propia configuración en un archivo Yaml dentro de su directorio config. Este archivo contendrá todos los valores de configuración inicial que el módulo necesita. Por ejemplo, un viejo conocido como Pathauto tiene esta configuración:

enabled_entity_types:
  - user
punctuation:
  hyphen: 1
verbose : FALSE
separator : '-'
max_length : 100
max_component_length: 100
transliterate : TRUE
reduce_ascii : FALSE
case : TRUE
ignore_words : 'a, an, as, at, before, but, by, for, from, is, in, into, like, of, off, on, onto, per, since, than, the, this, that, to, up, via, with'
update_action : 2

Esto complica un poco la creación de módulos, pero a cambio permite tener perfectamente estructurada la configuración de cualquier cosa. Por ejemplo, esto es un fragmento del tipo de contenido que uso para publicar artículos en esta página:

uuid: 8cec381d-8247-47b3-b899-ed0adfb3bd36
langcode: en
status: true
dependencies:
  config:
    - core.entity_view_mode.node.teaser
    - field.field.node.blog_post.body
    - field.field.node.blog_post.comment
    - field.field.node.blog_post.field_blog_post_image
    - field.field.node.blog_post.field_tags
    - field.field.node.blog_post.field_teaser
    - image.style.teaser
    - node.type.blog_post
  module:
    - ds
    - image
    - text
    - user

... continúa, es muy muy largo

Lo que nos va a permitir este sistema es poder exportar a un puñado de archivos toda la configuración de nuestro sitio Drupal, copiarlos, moverlos, pasarlos a un control de versiones tipo Git, y después importarlos en otro de nuestros entornos para tener disponibles todos los nuevos cambios o componentes.

Todo puede hacerse desde la administración de Drupal, pero es mucho más cómo utilizar Drush para todo el proceso.

Vamos a ver entonces cómo trabajar con la configuración.
 

Configuración inicial

Por defecto cuando instalamos Drupal 8 va a guardar la configuración en un directorio con nombre aleatorio, dentro de la carpeta files. Algo así:

sites/default/files/config_XXXX

Dentro de ese directorio se podrán ir almacenando los ficheros de configuración. Lo ideal sería mantener los archivos de configuración fuera del DocumentRoot de nuestro servidor web para que no sean accesibles, e incluirlos en nuestro sistema de control de versiones. Para cambiar este directorio de configuración podemos añadir lo siguiente en el archivo settings.php de nuestro sitio:

$config_directories = array(
  CONFIG_SYNC_DIRECTORY => '/directorio/de/configuracion/sync',
);

Ahora Drupal va a utilizar ese directorio para importar y exportar los archivos.
 

Exportar configuración

Como ya hemos comentado, tenemos dos opciones para hacer la exportación, bien desde el menú de administración o utilizando Drush. Podemos acceder desde Inicio  AdministraciónConfiguración > Desarrollo > Sincronizar, y:

  • Podemos exportar todo en un único fichero comprimido que y descargarlo desde el servidor con el navegador directamente a nuestro disco. Esto puede ser muy útil en determinados momentos si no tenemos un acceso por SSH a mano, por ejemplo.
  • Exportar componentes individuales, seleccionando el que nos interese. Esto nos mostrará la configuración de ese elemento en formato Yaml, pero solo podremos copiarla y pegarla en un fichero o en otro entorno de forma manual.

Sin embargo usando Drush podemos generar de una vez todos los ficheros en nuestro directorio sync, con el comando config-export, o su alias cex:

drush cex

Cuando termine el comando tendremos un archivo .yml por cada elemento de configuración de nuestro sitio. Además, tiene algunas opciones que pueden ser interesantes, como --add o --commit para incorporar automáticamente los cambios a nuestro repositorio Git.

Importar configuración

Para realizar el proceso inverso e importar configuración con nuevas funcionalidades o cambios, podremos utilizar la interfaz de administración de manera análoga a la exportación:

  • Importar toda la configuración en un único archivo comprimido,
  • Importar configuraciones individuales, pegando el contenido en formato Yaml en la caja de texto.

De nuevo la mejor opción suele ser usar Drush, para lo que primero colocaríamos los ficheros de configuración que queremos importar en nuestro directorio sync, bien a mano, con un script o con git pull, y después ejecutamos config-import, o su alias corto:

drush cim

Este comando nos mostrará primero las configuraciones que van a modificarse al importar, indicando si son nuevos bloques, modificaciones o eliminaciones, como se puede ver en la siguiente captura:

Ejemplo de drush config-import

Hay que tener cuidado, porque una vez aceptemos los cambios se modificará nuestra instalación de Drupal, con lo que podemos perder información, por lo que siempre es recomendable sacar una copia de la base de datos antes de hacer la importación.

Puede ser interesante utilizar la opción --partial, que no eliminará la configuración de elementos si faltan sus archivos de configuración.

Otras operaciones con Drush

Usando Drush también es posible obtener una lista de todas las configuraciones disponibles:

drush config-list

Una vez sepamos el nombre de la configuración que buscamos podemos obtenerla y editarla directamente desde la consola con el editor que tengamos configurado por defecto, y se guardará como configuración activa.

Por último, tenemos un comando que nos permite importar directamente la configuración desde otro sitio Drupal directamente usando los alias de Drush:

drush config-pull @produccion @desarrollo

Este comando exportará la configuración del sitio @produccion y la importará en @desarrollo, guardando además los correspondientes archivos de configuración en el directorio sync de @desarrollo

Conclusiones

Hasta ahora todo lo que he hecho con la configuración de Drupal 8 ha funcionado prácticamente sin problemas, y tener toda esta capacidad incluida en el core es sin duda un gran paso adelante. Todavía tendremos que ver cómo se comporta o que problemas pueden surgir en proyectos grandes y complejos, o cuando entren en juego elementos más complicados como lo que podíamos hacer en Drupal 7 con Features overrides, por ejemplo.

De momento, y como ya ha apuntado mucha gente, me parece que este es el gran cambio que va a aportar Drupal 8 con respecto a la versión anterior.

 

Referencias

https://drushcommands.com/drush-8x/config/

https://chromatichq.com/blog/drupal-7-features-vs-drupal-8-configuratio…

https://www.drupal.org/docs/8/configuration-management/managing-your-si…