Estoy creando un módulo personalizado en Drupal 8. Incluye algunos archivos de configuración YAML.
A medida que me desarrolle, necesito cambiar y agregar a la configuración, por ejemplo, agregar otro campo a mi entidad personalizada.
En la actualidad, la única forma en que he encontrado que Drupal nota los cambios es desinstalar el módulo y volver a instalarlo.
¿Hay alguna manera de hacer que Drupal verifique que los archivos de configuración proporcionados por los módulos sean los mismos que los de la configuración activa y, si no, actualice la configuración activa? ¿Cómo se manejan las actualizaciones del módulo? En D7 hook_update_N
se usaría para agregar campos usando PHP, pero parece que esto debería ser manejado por el CM en D8.
Cosas que he probado después de actualizar los archivos yml en el módulo:
drush cr
, sincronización de configuración.copiando manualmente todos los archivos de configuración actualizados
sites/default/files/config_XXX/staging/
, pero esto genera este error "La configuración por etapas no se puede importar, porque se origina en un sitio diferente a este sitio. Solo puede sincronizar la configuración entre instancias clonadas de este sitio". .Importar manualmente los archivos uno por uno utilizando el administrador de configuración. Esto funciona, pero obviamente debe haber una forma más automática.
[EDITAR] use manualmente el módulo config_update para inspeccionar los cambios y 'revertir' a la configuración del módulo. De nuevo, esto es manual.
EDITAR: desde la configuración de gestión - qué hacer y qué no hacer
NO HACER
Intente cambiar la configuración activa en su sitio cambiando los archivos en el directorio config / install de un módulo. Esto NO funcionará porque Drupal solo leerá desde ese directorio cuando el módulo esté instalado.
... pero los cambios van a suceder, a menos que los módulos estén vinculados a cualquier configuración que necesiten en su primer lanzamiento, y nunca puedan actualizar o agregar configuraciones.
Gracias por adelantado.
fuente
hook_update_N
, pero no estoy seguro de quéhook_update_N
. Excelente artículo sobre Drupal 8 para sitios pequeños (y parte 2 ). En D8 "los sitios poseen su configuración, no los módulos" .Respuestas:
Como se mencionó en la pregunta original y en los comentarios de seguimiento, hay una variedad de módulos contrib y métodos manuales para lograr esto.
Para hacerlo automáticamente, o de manera personalizada, creo
hook_update_N()
todavía es probablemente la opción más viable.Por ejemplo, este es un ejemplo de Head 2 Head para actualizar
system.site
y configurardefault_langcode
:También puede leer en la configuración (recomendado solo para agregar una nueva configuración, no necesariamente actualizar o anular la configuración que puede haber sido personalizada):
donde
$path
es la ruta absoluta almy_config.foo.yml
archivo.fuente
Cuando llegué a esta pregunta también pero realmente no encontré la respuesta correcta para mi situación aquí, me gustaría agregar otra respuesta.
Tenga en cuenta: ¡Anti-patrón por delante!
Caso de uso
Cuando desarrollamos proyectos, actualizamos constantemente nuestro entorno de prueba / aceptación con nuevas actualizaciones de configuración. Tomemos, por ejemplo, un simple módulo de noticias ficticio, nos gustaría agregar un tipo de contenido al módulo e implementarlo en nuestro entorno de aceptación. Después de la revisión, hemos concluido que faltan algunos campos y otras cosas relacionadas con la configuración. Dado que sabemos que el entorno de aceptación no se está actualizando en la configuración, realmente solo queremos volver a cargar toda la configuración desde el módulo mientras se agrega una nueva funcionalidad y no molestarnos al importar cada
.yml
archivo modificado .Solo necesitamos nuestra configuración en los módulos cuando estamos desarrollando sitios múltiples. Para sitios individuales, en su mayoría solo usamos la configuración de sitio exportada en la que el siguiente paso es innecesario.
Reimportar la configuración por completo (¡antipatrón!)
Descubrimos que al usar el servicio ConfigInstaller , podemos volver a importar la configuración completa desde un módulo específico.
Usar con precaución!
Me gustaría agregar que esto sobrescribirá cualquier contenido activo que haya sido alterado dentro del entorno. Por lo tanto, solo use esta solución cuando esté seguro de que es seguro sobrescribir la configuración activa. Nunca usaremos esto en un entorno de producción y solo aplicaremos en el desarrollo temprano.
Primero pruebe la solución de @ jhedstrom antes de comenzar a considerar esta.
fuente
He encontrado este Gist en GitHub, que revierte / recarga la configuración del módulo dada usando drush:
fuente
Basado en mi comentario: ¿Cómo actualizo la configuración de un módulo?
He creado una pequeña función que me ayuda con eso, aquí mi código de ejemplo:
fuente
La respuesta anterior (reimportación completa) también funcionó para mi caso de uso, pero primero pasé un tiempo buscando una reimportación más selectiva. Aquí está el código que tenía que parecía funcionar como un enlace de actualización y estaba basado en el código del módulo config_update:
fuente
Sincronizador de configuración módulo ayuda a resolver este problema de una manera agradable. Este conjunto de módulos de 7 módulos parece ser un poco exagerado solo para este caso (su intención es principalmente fusionar de manera segura las actualizaciones sin sobrescribir las personalizaciones), pero debido a su concepto también permite rastrear e importar cambios de configuración desde el módulo / instalación y / carpetas opcionales rápidamente.
Básicamente, puede probarlo de la siguiente manera:
Nota: si solo desea usar config_sync para acelerar la importación de la configuración durante el desarrollo del módulo (y no le importa fusionarse con las actualizaciones del cliente), es suficiente tener esta suite instalada y habilitada solo en su entorno local (desarrollo) ( suponiendo que su módulo irá a entornos superiores después de finalizar y utilizar la administración de configuración central D8 para publicar su configuración en entornos superiores).
fuente