刷新实体更新的目的是什么?


14

在更新Drupal 8模块之后,在Drupal 8状态页面上已警告我:

实体/字段定义:在实体类型和字段定义中检测到以下更改。

经过Google的一番摸索,似乎可以解决该问题的解决方案drush entity-updates。但是,我觉得这有点奇怪,因为它似乎是更新数据库后需要记住或合并到工作流中的另一条命令,更不用说它似乎对如何解决原始警告并不立即显而易见。

而且,在开发过程中,您通常会在“状态”页面中收到其他操作的警报,这意味着您不会立即知道是否需要执行此操作。

谁能解释这个警告的含义-或更确切地说,为什么将此功能引入D8,为什么不将其纳入数据库更新操作中,而必须单独运行?

Answers:


19

drush entity-updates是开发人员工具。如果您在自定义模块中更改实体/字段定义,则可以快速应用。

在生产中,这不应发生。如果您在官方发行版之间更新模块,则模块中的更新代码应能解决此问题。

但就您而言,您提到的是您的网站正在开发中。因此,有很多事情可能导致了这种情况。您可以使用自己的代码,也可以使用contrib模块的dev或alpha版本。

我从用于实体架构更新的CR 写更新功能中发现了此示例,并删除了自动化(还有更多示例):

/**
 * 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);
}

2
除了那实际上是一个不好的例子。如果您是模块,则应该进行非常具体的更新。安装新的字段定义,更新实体类型定义。如果您更新多个模块,或者该模块将来会进行其他更改并从旧版本进行更新,则这样做可能会非常不利。node.install有许多更好的更新示例。
贝尔迪尔

1
最初,这是作为updb / update.php的一部分自动完成的。但是它并不总是有效,它不支持在有数据的情况下可能造成破坏性的更新,从而导致很多问题。如果字段中有数据,则不能只调用此方法,而需要自己进行更新,这可能非常复杂。有关更多信息,请参阅drupal.org/node/2554097
Berdir

2
关于Berdir评论的注意事项:我已删除了不良示例,并从变更记录中将其替换为一个不良示例。
安迪

2
需要明确的是,在生产环境中运行实体更新不是一个好主意,原因是它可能具有破坏性。例如,如果您更改字段存储uuid,导入更改的存储定义,运行cron,然后运行entity-updates,它将破坏该字段中的所有现有内容。
丹恩·鲍威尔

2
模块应负责通过目标更新挂钩来应用自己的模式更新。entity-updates除了在带有自定义模块的站点的开发过程的早期,您不必关心数据破坏之外,没有人应该定期运行该命令。
丹恩·鲍威尔

1

从“ v 8.7.0”中删除了“ drush entity-updates”命令

参见https://www.drupal.org/node/3034742

从8.7.0开始,Drupal核心不再提供对自动实体更新的支持。每当需要创建,更改或删除实体类型或字段存储定义时,都必须使用Update API提供的显式更新功能并使用实体定义更新管理器提供的API来完成。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.