Acele varlık güncellemelerinin amacı nedir?


14

Drupal 8 modüllerini güncelledikten sonra, Drupal 8 durum sayfasında şu uyarıda bulundum:

Varlık / alan tanımları: Varlık türü ve alan tanımlarında aşağıdaki değişiklikler tespit edildi.

Google'ın biraz dolaşmasından sonra, bunun çözümü çalıştırmak gibi görünüyor drush entity-updates. Ancak, veritabanını güncelledikten sonra hatırlamak veya kişinin iş akışına dahil edilmesi gereken başka bir komut gibi göründüğü için biraz garip buluyorum, orijinal uyarının nasıl ele alınacağı konusunda hemen açık görünmedi.

Dahası, geliştirme sırasında Durum sayfasındaki diğer eylemler için bir uyarıya sahip olmanız genellikle budur, bu işlemi yapmanız gerekip gerekmediğini hemen bilmeyeceğiniz anlamına gelir.

Herkes bu uyarının ne için olduğunu açıklayabilir mi - ya da daha doğrusu, bu özellik neden D8'e dahil edildi ve neden veritabanı güncelleme işlemine dahil edilmedi, ancak ayrı olarak çalıştırılmalı?

Yanıtlar:


19

drush entity-updatesbir geliştirici aracıdır. Özel modülünüzdeki varlık / alan tanımlarını değiştirirseniz, bunu hızla uygulayabilirsiniz.

Üretimde bu olmamalı. Bir modülü resmi sürümler arasında güncellerseniz, modüldeki güncelleme kodu bunu işlemelidir.

Ancak sizin durumunuzda, sitenizin gelişmekte olduğunu belirtiyorsunuz. Yani buna neden olabilecek birçok şey var. Kendi kodunuzda veya katkıda bulunan modüllerin geliştirici veya alfa sürümlerinde.

Bu örneği varlık şeması güncellemeleri, otomasyon kaldırılmış CR Yazma güncelleştirme işlevlerinden buldum (daha fazla örnek var):

/**
 * 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
Bunun dışında aslında kötü bir örnek. Eğer bir modülseniz, çok özel güncellemeler yapmalısınız. Yeni bir alan tanımı yükleyin, varlık türü tanımını güncelleyin. Birden fazla modülü güncellerseniz veya modül gelecekte başka bir değişiklik yaparsa ve eski bir sürümden güncelleme yaparsanız bu durum çok kötü olabilir. node.install uygulamasının daha iyi güncelleme örnekleri vardır.
Berdir

1
Başlangıçta bu, updb / update.php dosyasının bir parçası olarak otomatik olarak yapıldı. Ancak her zaman işe yaramaz, veri olduğunda ve çok fazla soruna neden olan olası yıkıcı güncellemeleri desteklemez. Bir alanda verileriniz varsa, sadece bu yöntemi çağıramazsınız, bunu kendiniz güncellemeniz gerekir, bu da oldukça karmaşık olabilir. Daha fazla bilgi için drupal.org/node/2554097
adresine

2
Berdir'in yorumuyla ilgili not: Kötü örneği kaldırdım ve değişiklik kaydından biriyle değiştirdim.
Andy

2
Açık olmak gerekirse, üretimde varlık güncellemelerini çalıştırmanın Kötü bir Fikir olmasının nedeni, yıkıcı olabilmesidir. Örneğin, bir alan depolama uuidini değiştirirseniz, değiştirilen depolama tanımını içe aktarır, cron'u çalıştırır ve ardından varlık güncellemelerini çalıştırırsanız, o alandaki mevcut içeriği yok eder.
Dane Powell

2
Modüller, hedeflenen güncelleme kancaları aracılığıyla kendi şema güncellemelerini uygulamaktan sorumlu olmalıdır. entity-updatesVeri yok etmeyi umursamadığınız özel modüllere sahip sitelerin geliştirme sürecinin erken aşamaları dışında, hiç kimse komutu düzenli olarak çalıştırmamalıdır .
Dane Powell

1

"Drush entity-updates" komutu v 8.7.0'dan kaldırıldı

Bkz. Https://www.drupal.org/node/3034742

8.7.0'dan başlayarak, Drupal core artık otomatik varlık güncellemeleri için destek sağlamaz. Bir varlık türü veya alan depolama tanımının oluşturulması, değiştirilmesi veya silinmesi gerektiğinde, güncelleme API'sı tarafından sağlanan açık bir güncelleme işleviyle ve varlık tanımı güncelleme yöneticisi tarafından sağlanan API kullanılarak yapılmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.