No se puede instalar ... ya existe en la configuración activa

15

En Drupal 8.1 sigo ejecutándome en ese tipo de mensajes cuando trato de activar un módulo personalizado o una función personalizada que realiza algunas modificaciones en la página básica. (agregar campos).

Es realmente molesto ...

Pasos:

  • Borrar la base de datos por completo
  • ve a /install.php y elige Perfil estándar
  • Ahora que el sitio se está ejecutando, vaya a Extender
  • Seleccionar función: página básica

Resultado:

Unable to install Feature - Basic Page, core.base_field_override.node.page.promote, core.entity_form_display.node.page.default, core.entity_view_display.node.page.default, core.entity_view_display.node.page.teaser, field.field.node.page.body, node.type.page already exist in active configuration.

Bueno, sí ... eso es lo que quiero hacer: ¡cambiar esa configuración predeterminada!

Expexted:

Poder instalar mi función que hace algunas modificaciones a la página básica.

Mi característica

Aquí está mi característica crear con el módulo de características

Básicamente agrega dos campos, banner_image y background_image a la página básica

Archivos:

config
    install
        core.base_field_override.node.page.changed.yml
        core.base_field_override.node.page.created.yml
        core.base_field_override.node.page.promote.yml
        core.base_field_override.node.page.status.yml
        core.base_field_override.node.page.sticky.yml
        core.base_field_override.node.page.title.yml
        core.base_field_override.node.page.uid.yml
        core.entity_form_display.node.page.default.yml
        core.entity_view_display.node.page.default.yml
        core.entity_view_display.node.page.teaser.yml
        field.field.node.page.body.yml
        field.field.node.page.field_banner_image.yml
        field.field.node.page.field_image.yml
        field.storage.node.field_banner_image.yml
        language.content_settings.node.page.yml
        node.type.page.yml
feature_basic_page.features.yml
feature_basic_page.info.yml

¿Por qué esta cosa simple no es compatible? ¿Es un error? ¿Qué debo hacer para poder usar mi función?

Guillaume Bois
fuente
1
Use el módulo drupal EasyInstall que se usa para eliminar configuraciones activas
Karthikeyan Manivasagam
1
Módulo interesante +1 - vale la pena echarle un vistazo - gracias @KarthikeyanManivasagam
therobyouknow

Respuestas:

24

Con drush probablemente puedas hacer

drush config-delete module_name.settings

para eliminar las configuraciones que se quejan

GiorgosK
fuente
También descubrí durante mi batalla épica contra Drupal que puedes mover esas configuraciones en una optional/carpeta para que se calle. Pero no estoy seguro de todas las implicaciones ...
Guillaume Bois
@GuillaumeBois: las implicaciones son que estas configuraciones opcionales se ignorarían si ya están instaladas o si no se cumplen las dependencias. Por lo tanto, puede generar más problemas si la configuración es necesaria para que el módulo funcione.
Renrhaf
+1 gracias @GiorgosK (Parte 1 de 2): Encontré que esta solución funcionaba en mi caso: este error se mostró en el navegador web de mi sitio de desarrollo: Warning: in_array() expects parameter 2 to be array, null given in lightning_layout_block_alter() (line 91 of modules/contrib/lightning_layout/lightning_layout.module).después de configurar el código de mi sitio, la fuente y la base de datos de git en otra máquina .
therobyouknow
(Parte 2 de 2) Entonces, para resolverlo, intenté desinstalar lightning_layout y volver a instalarlo. drush pm-uninstall lightning_layoutfuncionó pero luego, cuando traté de reinstalarlo, drush en lightning_layoutrecibí este error de línea de comando "En PreExistingConfigException.php línea 65: los objetos de configuración (field.storage.node.panelizer) proporcionados por lightning_layout ya existen en la configuración activa" Así que usé su solución así: drush config-delete field.storage.node.panelizer y fue capaz de volver a habilitar el módulo:drush en lightning_layout
therobyouknow
1
si no está seguro de qué "configuración" tiene que eliminar, debe ejecutar "drush config-list" para obtener el nombre exacto de la configuración
Jorge Valvert
3

Esto no es compatible porque un módulo puede no reemplazar una entidad de configuración que ya existe con la configuración de instalación.

Para agregar configuraciones de modo y vista para un tipo de nodo ya existente, debe implementar esto en código en hook_install ().

O primero debe eliminar el tipo de nodo en su sitio, pero luego también debe eliminar el contenido.

Y no, esto no es un error, así es como se define para evitar la pérdida de configuración.

Berdir
fuente
Esto es muy triste. En D7 esto era posible (agregar campos a una página básica a través de una Función). Todavía creo que debería estar en D8 también. Usted dice que es para evitar la pérdida de configuración, pero en realidad, simplemente agrega configuraciones (campos, peso, etiqueta, etc.). Tenga en cuenta que también tuve este problema con mis propios módulos personalizados.
Guillaume Bois
No, no solo agrega. la vista y las pantallas de formulario se comparten en todos los campos de un solo tipo de nodo. ¿Qué sucede si dos módulos intentan agregar ese archivo? ¿Quién va a ganar? ¿Qué sucede con los campos existentes que ya están en el tipo de página? ¿Qué pasa si el tipo de nodo básico existe pero con configuraciones diferentes a las de su campo? Los escenarios de comportamiento como ese no están definidos. Para una característica independiente, es mejor que defina su propio tipo de nodo y para implementar este cambio en su propio sitio, no necesita un módulo de características como en 7.x, simplemente puede exportar la configuración e importarla nuevamente.
Berdir
@berdir esto es muy interesante. Así que vengo de este problema al intentar crear una función de perfil de usuario que incluye notas de vista y formulario. Entonces, ¿estás diciendo que esto no se puede hacer en las funciones porque el tipo de contenido del usuario ya habrá existido y la función está tratando de habilitarlo? ¿Hay alguna forma de permitir que una función anule esto para que alguien pueda habilitar una función de perfil en un sitio ya existente?
kaleemclarkson
El usuario @kaleemclarkson no es un tipo de contenido sino un tipo de entidad. La única forma de hacerlo es lo que describí, debe implementar el código en hook_install () de su módulo de características para establecer el formulario y ver la configuración de visualización. O use el módulo de perfil y defina su propio tipo de perfil allí.
Berdir
3

Módulo encontrado, use el módulo Easy Install para purgar la configuración activa sin usar devel o drush . Funciona incluso si se ha perdido la carpeta opcional y la opción forzada en los archivos de configuración de su módulo ( yml )

Karthikeyan Manivasagam
fuente
1
¡Esta es una opción fantástica! ¡Acabo de usar esto hoy y me ahorró mucho tiempo!
rtd1123
3

Tengo el mismo problema para el sitio del panteón. Entré comando drush

Pantheonsite: drush @ pantheon.SITENAME.ENVNAME config-delete ERRORNAME

Localsite: drush config-delete ERRORNAME

Es trabajo para mí.

omkar gaonkar
fuente
0

Si desea agregar configuraciones a su módulo personalizado pero ya existen en la configuración activa, y por alguna razón no puede usar drush para eliminar esas configuraciones (en mi caso porque es parte de un perfil de instalación), y está seguro no habrá ningún problema con que sobrescriba la configuración, aquí hay un enfoque para reemplazar esas configuraciones.

Agregue una nueva carpeta en su módulo personalizado, / config / hook_install y agregue sus archivos de configuración .yml en esa carpeta, luego en la instalación de gancho de su módulo.

use Drupal\Component\Serialization\Yaml;

/**
 * Implements hook_install().
 */
function mymodule_install() {

  // Replace these configs.  We're using code to do this, as they are already
  // installed.
  $config_files = [
    'language.types',
    'language.negotiation',
  ];

  foreach ($config_files as $config_id) {
    $raw_data = file_get_contents(drupal_get_path('module', 'mymodule') . '/config/hook_install/' . $config_id . '.yml');
    \Drupal::configFactory()->getEditable($config_id)
      ->setData(Yaml::decode($raw_data))
      ->save();
  }
}
oknate
fuente