Яка мета оновити суттєві оновлення?


14

Після оновлення модулів Drupal 8 мене на сторінці статусу Drupal 8 попередили:

Визначення сутності / поля: Наступні зміни були виявлені у визначеннях типу та поля сутності.

Після трохи розкопування Google, здається, рішення цього - запустити drush entity-updates. Однак я вважаю це трохи дивним, оскільки, здається, це ще одна команда, яку потрібно запам'ятати або включити в робочий процес після оновлення бази даних, не кажучи вже про це, здавалося, не очевидно, як вирішити вихідне попередження.

Більше того, часто трапляється так, що в процесі розробки ви будете отримувати сповіщення про інші дії на сторінці статусу, що означає, що ви не одразу дізнаєтесь, чи потрібно це робити.

Чи може хтось пояснити, для чого це попередження - а точніше, чому ця функція була введена в D8, і чому вона не враховується в операції оновлення бази даних, але її потрібно запускати окремо?

Відповіді:


19

drush entity-updatesє інструментом для розробників. Якщо ви зміните визначення сутності / поля у своєму спеціальному модулі, ви можете швидко застосувати це.

У виробництві цього не повинно відбуватися. Якщо ви оновлюєте модуль між офіційними випусками, тоді код оновлення в модулі повинен це впоратися.

Але у вашому випадку ви згадуєте, що ваш сайт розвивається. Тож є багато речей, які могли це спричинити. Або у власному коді, або у розробниках або альфа-версіях модулів contrib.

Я знайшов цей приклад з функцій оновлення CR Write для оновлень схеми особи, автоматизацію видалено (де є додаткові приклади):

/**
 * 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 для отримання додаткової інформації
Бердір

2
Примітка щодо коментаря Бердіра: Я видалив поганий приклад і замінив його одним із записів змін.
Енді

2
Щоб було зрозуміло, причина того, що погана ідея запускати оновлення суті у виробництві, полягає в тому, що це може бути руйнівним. Наприклад, якщо ви зміните uuid зберігання поля, імпортуєте змінене визначення сховища, запустіть cron, а потім запустіть оновлення суті, це знищить будь-який існуючий вміст у цьому полі.
Дейн Пауелл

2
Модулі повинні відповідати за застосування власних оновлень схеми за допомогою цільових гаків оновлення. Ніхто не повинен запускати entity-updatesкоманду регулярно, за винятком раннього процесу розробки сайтів із спеціальними модулями, де вам не байдуже знищення даних.
Дейн Пауелл

1

Команда "Друкувати оновлення сутності" видалена з версії 8.7.0

Дивіться https://www.drupal.org/node/3034742

Починаючи з 8.7.0, ядро ​​Drupal більше не підтримує автоматичне оновлення об'єктів. Кожного разу, коли потрібно створити, змінити чи видалити визначення об’єму об'єкта чи поля зберігання, це повинно бути виконано за допомогою функції явного оновлення, передбаченої API оновлення, та з використанням API, наданого менеджером оновлення визначення сутності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.