Apa tujuan dari pembaruan entitas drush?

14

Setelah memperbarui modul Drupal 8, saya telah diperingatkan pada halaman status Drupal 8 bahwa:

Definisi entitas / bidang: Perubahan berikut ini terdeteksi pada tipe entitas dan definisi bidang.

Setelah sedikit mencari-cari Google, tampaknya solusi untuk ini adalah untuk menjalankan drush entity-updates. Namun saya menemukan ini agak aneh karena tampaknya menjadi perintah lain yang perlu diingat atau dimasukkan ke dalam alur kerja seseorang setelah memperbarui database, belum lagi tampaknya tidak segera jelas tentang cara mengatasi peringatan asli.

Terlebih lagi, sering kali dalam pengembangan Anda akan memiliki peringatan untuk tindakan lain di halaman Status yang berarti Anda tidak akan segera tahu jika Anda perlu melakukan tindakan ini.

Adakah yang bisa menjelaskan untuk apa peringatan ini - atau lebih tepatnya, mengapa fitur ini diperkenalkan ke D8, dan mengapa tidak diperhitungkan dalam operasi pembaruan basis data tetapi harus dijalankan secara terpisah?

njp
sumber

Jawaban:

19

drush entity-updatesadalah alat pengembang. Jika Anda mengubah definisi entitas / bidang dalam modul khusus Anda, Anda dapat dengan cepat menerapkan ini.

Dalam produksi ini seharusnya tidak terjadi. Jika Anda memperbarui modul di antara rilis resmi, maka kode pembaruan dalam modul harus menangani ini.

Tetapi dalam kasus Anda, Anda menyebutkan bahwa situs Anda sedang dalam pengembangan. Jadi ada banyak hal, yang bisa menyebabkan ini. Baik dalam kode Anda sendiri atau dalam versi contrib modul dev atau alpha.

Saya menemukan contoh ini dari fungsi pembaruan tulis CR untuk pembaruan skema entitas, otomatisasi dihapus (di mana ada contoh lebih lanjut):

/**
 * 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
sumber
2
Tapi itu sebenarnya contoh yang buruk. jika Anda seorang modul, Anda harus melakukan pembaruan yang sangat spesifik. Instal definisi bidang baru, perbarui definisi jenis entitas. Ini bisa sangat buruk jika Anda memperbarui beberapa modul atau jika modul akan membuat perubahan lain di masa depan dan Anda memperbarui dari versi lama. node.install memiliki sejumlah contoh pembaruan yang lebih baik.
Berdir
1
Awalnya, ini dilakukan secara otomatis sebagai bagian dari updb / update.php. Tapi itu tidak selalu berhasil, itu tidak mendukung pembaruan yang mungkin merusak ketika ada data dan itu menyebabkan banyak masalah. Jika Anda memiliki data dalam suatu bidang, Anda tidak bisa memanggil metode ini, Anda perlu memperbaruinya sendiri, yang bisa sangat rumit. Lihat drupal.org/node/2554097 untuk informasi lebih lanjut
Berdir
2
Catatan tentang komentar Berdir: Saya telah menghapus contoh buruk dan menggantinya dengan satu dari catatan perubahan.
Andy
2
Hanya untuk memperjelas, alasan bahwa itu adalah Ide Buruk untuk menjalankan pembaruan entitas dalam produksi adalah bahwa itu bisa merusak. Misalnya, jika Anda mengubah cairan penyimpanan bidang, impor definisi penyimpanan yang diubah, jalankan cron, dan kemudian jalankan pembaruan entitas, itu akan menghancurkan konten apa pun yang ada di bidang itu.
Dane Powell
2
Modul harus bertanggung jawab untuk menerapkan pembaruan skema mereka sendiri melalui kait pembaruan yang ditargetkan. Tidak seorang pun harus menjalankan entity-updatesperintah secara teratur, kecuali untuk awal dalam proses pengembangan situs dengan modul khusus di mana Anda tidak peduli dengan kerusakan data.
Dane Powell
1

Perintah "pembaruan entitas drush" telah dihapus dari v 8.7.0

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

Dimulai dengan 8.7.0, inti Drupal tidak lagi menyediakan dukungan untuk pembaruan entitas otomatis. Kapan pun jenis entitas atau definisi penyimpanan bidang perlu dibuat, diubah, atau dihapus, itu harus dilakukan dengan fungsi pembaruan eksplisit sebagaimana disediakan oleh API Pembaruan, dan menggunakan API yang disediakan oleh manajer pembaruan definisi entitas.

Andriyun
sumber