¿Cuál es el propósito de las actualizaciones de entidades drush?

14

Después de actualizar los módulos de Drupal 8, se me advirtió en la página de estado de Drupal 8 que:

Definiciones de entidad / campo: Se detectaron los siguientes cambios en el tipo de entidad y las definiciones de campo.

Después de un poco de búsqueda de Google, parece que la solución a esto es correr drush entity-updates. Sin embargo, esto me parece un poco extraño, ya que parece ser otro comando que uno debe recordar o incorporar al flujo de trabajo después de actualizar la base de datos, sin mencionar que no parecía inmediatamente obvio sobre cómo abordar la advertencia original.

Además, a menudo ocurre que en el desarrollo tendrá una alerta para otras acciones en la página Estado, lo que significa que no sabrá de inmediato si necesita actuar esto.

¿Alguien puede explicar para qué es esta advertencia, o más bien, por qué esta característica se ha introducido en D8 y por qué no se incluye en la operación de actualización de la base de datos, sino que debe ejecutarse por separado?

njp
fuente

Respuestas:

19

drush entity-updateses una herramienta de desarrollador Si cambia las definiciones de entidad / campo en su módulo personalizado, puede aplicar esto rápidamente.

En producción esto no debería suceder. Si actualiza un módulo entre lanzamientos oficiales, entonces el código de actualización en el módulo debería manejar esto.

Pero en su caso está mencionando que su sitio está en desarrollo. Así que hay muchas cosas que podrían haber causado esto. Ya sea en su propio código o en las versiones dev o alfa de los módulos contrib.

Encontré este ejemplo de las funciones de actualización de CR Write para actualizaciones de esquema de entidad, automatización eliminada (donde hay más ejemplos):

/**
 * Add 'revision_translation_affected' field to 'node' entities.
 */
function node_update_8001() {
  // Install the definition that this field had in
  // \Drupal\node\Entity\Node::baseFieldDefinitions()
  // at the time that this update function was written. If/when code is
  // deployed that changes that definition, the corresponding module must
  // implement an update function that invokes
  // \Drupal::entityDefinitionUpdateManager()->updateFieldStorageDefinition()
  // with the new definition.
  $storage_definition = BaseFieldDefinition::create('boolean')
      ->setLabel(t('Revision translation affected'))
      ->setDescription(t('Indicates if the last edit of a translation belongs to current revision.'))
      ->setReadOnly(TRUE)
      ->setRevisionable(TRUE)
      ->setTranslatable(TRUE);

  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition('revision_translation_affected', 'node', 'node', $storage_definition);
}
4k4
fuente
2
Excepto que en realidad es un mal ejemplo. Si eres un módulo, debes hacer actualizaciones muy específicas. Instale una nueva definición de campo, actualice una definición de tipo de entidad. Esto puede ir muy mal si actualiza varios módulos o si el módulo hará otro cambio en el futuro y actualiza desde una versión anterior. node.install tiene varios ejemplos de actualizaciones mejores.
Berdir el
1
Inicialmente, esto se hizo automáticamente como parte de updb / update.php. Pero no siempre funciona, no admite actualizaciones posiblemente destructivas cuando hay datos y eso causó muchos problemas. Si tiene datos en un campo, no puede simplemente llamar a este método, debe actualizarlo usted mismo, lo que puede ser bastante complicado. Consulte drupal.org/node/2554097 para obtener más información
Berdir, el
2
Nota sobre el comentario de Berdir: eliminé el mal ejemplo y lo reemplacé con uno del registro de cambios.
Andy
2
Para ser claros, la razón por la que es una mala idea ejecutar actualizaciones de entidades en producción es que puede ser destructivo. Por ejemplo, si cambia un uuid de almacenamiento de campo, importa la definición de almacenamiento modificada, ejecuta cron y luego ejecuta actualizaciones de entidad, destruirá cualquier contenido existente en ese campo.
Dane Powell
2
Los módulos deben ser responsables de aplicar sus propias actualizaciones de esquema a través de enlaces de actualización específicos. Nadie debería ejecutar el entity-updatescomando de forma regular, excepto en las primeras etapas del proceso de desarrollo de sitios con módulos personalizados donde no le importa la destrucción de datos.
Dane Powell
1

El comando "actualizaciones de entidad drush" se ha eliminado de v 8.7.0

Ver https://www.drupal.org/node/3034742

A partir de 8.7.0, Drupal core ya no brinda soporte para actualizaciones automáticas de entidades. Siempre que se deba crear, cambiar o eliminar un tipo de entidad o definición de almacenamiento de campo, se debe hacer con una función de actualización explícita según lo dispuesto por la API de actualización, y utilizando la API proporcionada por el administrador de actualización de definición de entidad.

Andriyun
fuente