Jaki jest cel drush-aktualizacji bytów?

14

Po aktualizacji modułów Drupal 8 zostałem ostrzeżony na stronie statusu Drupal 8, że:

Definicje jednostek / pól: Wykryto następujące zmiany w typie jednostki i definicjach pól.

Po odrobinie szperania w Google wydaje się, że rozwiązaniem tego jest uruchomienie drush entity-updates. Jednak wydaje mi się to nieco dziwne, ponieważ wydaje się, że jest to kolejne polecenie, które należy zapamiętać lub włączyć do przepływu pracy po aktualizacji bazy danych, nie wspominając już o tym, że nie wydawało się od razu oczywiste, jak rozwiązać pierwotne ostrzeżenie.

Co więcej, często zdarza się, że w fazie rozwoju będziesz otrzymywać powiadomienia o innych działaniach na stronie Status, co oznacza, że ​​nie będziesz od razu wiedział, czy musisz to zrobić.

Czy ktoś może wyjaśnić, po co jest to ostrzeżenie - a raczej dlaczego ta funkcja została wprowadzona do D8 i dlaczego nie jest uwzględniona w operacji aktualizacji bazy danych, ale musi być uruchomiona osobno?

njp
źródło

Odpowiedzi:

19

drush entity-updatesto narzędzie programistyczne. Jeśli zmienisz definicje encji / pól w niestandardowym module, możesz to szybko zastosować.

W produkcji tak się nie powinno stać. Jeśli aktualizujesz moduł między oficjalnymi wydaniami, powinien to obsłużyć kod aktualizacji w module.

Ale w twoim przypadku wspominasz, że twoja strona się rozwija. Jest więc wiele rzeczy, które mogły to spowodować. Albo we własnym kodzie, albo w wersjach dev lub alpha modułów contrib.

Znalazłem ten przykład z funkcji aktualizacji CR Write dla aktualizacji schematu encji, automatyzacja usunięta (tam, gdzie są dalsze przykłady):

/**
 * 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
źródło
2
Tyle że to naprawdę zły przykład. jeśli jesteś modułem, powinieneś robić bardzo konkretne aktualizacje. Zainstaluj nową definicję pola, zaktualizuj definicję typu jednostki. Może to pójść bardzo źle, jeśli zaktualizujesz wiele modułów lub jeśli moduł wprowadzi kolejną zmianę w przyszłości i zaktualizujesz ze starej wersji. node.install ma wiele lepszych przykładów aktualizacji.
Berdir
1
Początkowo było to zrobione automatycznie w ramach aktualizacji / aktualizacji.php. Ale nie zawsze działa, nie obsługuje potencjalnie destrukcyjnych aktualizacji, gdy są dane, co spowodowało wiele problemów. Jeśli masz dane w polu, nie możesz po prostu wywołać tej metody, musisz ją samodzielnie zaktualizować, co może być dość skomplikowane. Aby uzyskać więcej informacji, zobacz drupal.org/node/2554097
Berdir,
2
Uwaga dotycząca komentarza Berdira: usunąłem zły przykład i zastąpiłem go jednym z rekordu zmian.
Andy,
2
Żeby było jasne, przyczyną tego, że uruchamianie aktualizacji bytu w produkcji jest kiepskim pomysłem, jest to, że może być destrukcyjne. Na przykład, jeśli zmienisz identyfikator UUID pamięci masowej, zaimportujesz zmienioną definicję pamięci masowej, uruchom cron, a następnie uruchom aktualizację encji, spowoduje to zniszczenie istniejącej zawartości w tym polu.
Dane Powell
2
Moduły powinny być odpowiedzialne za stosowanie własnych aktualizacji schematu za pośrednictwem ukierunkowanych aktualizacji. Nikt nie powinien entity-updatesregularnie uruchamiać polecenia, z wyjątkiem wczesnych etapów tworzenia witryn z niestandardowymi modułami, w których nie obchodzi Cię niszczenie danych.
Dane Powell
1

Polecenie „drush entity-updates” zostało usunięte z wersji 8.7.0

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

Począwszy od wersji 8.7.0, rdzeń Drupal nie zapewnia już obsługi automatycznych aktualizacji encji. Ilekroć trzeba utworzyć, zmienić lub usunąć typ jednostki lub definicję pamięci pola, należy to zrobić za pomocą jawnej funkcji aktualizacji dostarczonej przez Update API i za pomocą API dostarczonego przez menedżera aktualizacji definicji encji.

Andriyun
źródło