วัตถุประสงค์ของการอัพเดตเอนทิตี drush คืออะไร?


14

หลังจากอัปเดตโมดูล Drupal 8 ฉันได้รับคำเตือนในหน้าสถานะ Drupal 8 ที่:

คำนิยามเอนทิตี / ฟิลด์: ตรวจพบการเปลี่ยนแปลงต่อไปนี้ในประเภทเอนทิตีและคำจำกัดความของฟิลด์

หลังจากที่บิตของ Google drush entity-updatesการค้นหาดูเหมือนว่าวิธีการนี้คือการทำงาน อย่างไรก็ตามฉันคิดว่ามันแปลกไปหน่อยเพราะมันดูเหมือนจะเป็นคำสั่งที่ต้องจำหรือรวมไว้ในเวิร์กโฟลว์ของคนหลังจากอัปเดตฐานข้อมูลไม่พูดถึงมันดูเหมือนจะไม่ชัดเจนในทันทีเกี่ยวกับวิธีการแก้ไขคำเตือนเดิม

ยิ่งไปกว่านั้นในกรณีของการพัฒนาคุณจะได้รับการแจ้งเตือนสำหรับการกระทำอื่น ๆ ในหน้าสถานะซึ่งจะหมายความว่าคุณจะไม่ทราบทันทีหากคุณต้องการดำเนินการนี้

ทุกคนสามารถอธิบายได้ว่าคำเตือนนี้มีไว้เพื่ออะไร - เหตุใดจึงมีการนำคุณลักษณะนี้ไปใช้ใน D8 และเหตุใดจึงไม่รวมอยู่ในการดำเนินการอัปเดตฐานข้อมูล แต่ต้องแยกจากกัน

คำตอบ:


19

drush entity-updatesเป็นเครื่องมือสำหรับนักพัฒนา หากคุณเปลี่ยนนิยามเอนทิตี / ฟิลด์ในโมดูลที่กำหนดเองของคุณคุณสามารถใช้สิ่งนี้ได้อย่างรวดเร็ว

ในการผลิตสิ่งนี้ไม่ควรเกิดขึ้น หากคุณอัปเดตโมดูลระหว่างรุ่นที่เป็นทางการแล้วรหัสอัปเดตในโมดูลควรจัดการกับสิ่งนี้

แต่ในกรณีของคุณคุณกำลังพูดถึงว่าเว็บไซต์ของคุณกำลังพัฒนา มีหลายสิ่งหลายอย่างซึ่งอาจทำให้เกิดสิ่งนี้ ไม่ว่าจะในโค้ดของคุณเองหรือโมดูล contrib รุ่น dev หรือ alpha

ฉันพบตัวอย่างนี้จากฟังก์ชั่นอัพเดท 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 มีตัวอย่างของการอัพเดตที่ดีกว่าจำนวนมาก
Berdir

1
เริ่มแรกสิ่งนี้ทำโดยอัตโนมัติโดยเป็นส่วนหนึ่งของ updb / update.php แต่มันไม่ได้ผลเสมอไปมันไม่รองรับการอัพเดทที่อาจทำลายได้เมื่อมีข้อมูลและทำให้เกิดปัญหามากมาย หากคุณมีข้อมูลในเขตข้อมูลคุณไม่สามารถเรียกวิธีนี้ได้เลยคุณต้องอัปเดตด้วยตัวเองซึ่งอาจมีความซับซ้อน ดูdrupal.org/node/2554097สำหรับข้อมูลเพิ่มเติม
Berdir

2
หมายเหตุเกี่ยวกับความคิดเห็นของ Berdir: ฉันได้ลบตัวอย่างที่ไม่ดีและแทนที่ด้วยหนึ่งจากบันทึกการเปลี่ยนแปลง
Andy

2
เพียงเพื่อให้ชัดเจนเหตุผลที่เป็นความคิดที่ไม่ดีในการเรียกใช้การอัพเดตเอนทิตีในการผลิตก็คือมันสามารถทำลายล้างได้ ตัวอย่างเช่นหากคุณเปลี่ยนที่เก็บข้อมูลของฟิลด์ uuid ให้นำเข้าคำจำกัดความการจัดเก็บที่เปลี่ยนแปลงแล้วเรียกใช้ cron และจากนั้นเรียกใช้การอัพเดตเอนทิตีมันจะทำลายเนื้อหาที่มีอยู่ใด ๆ ในฟิลด์นั้น
Dane Powell

2
โมดูลควรรับผิดชอบในการใช้การปรับปรุงสคีมาของตนเองผ่านทางฮุคการอัพเดทที่ตรงเป้าหมาย ไม่มีใครควรรันentity-updatesคำสั่งเป็นประจำยกเว้นในช่วงต้นของกระบวนการพัฒนาไซต์ที่มีโมดูลที่กำหนดเองซึ่งคุณไม่สนใจเกี่ยวกับการทำลายข้อมูล
Dane Powell

1

คำสั่ง "drush entity-updates" ถูกลบออกจาก v 8.7.0 แล้ว

ดูhttps://www.drupal.org/node/3034742

เริ่มต้นด้วย 8.7.0, Drupal core ไม่สนับสนุนการอัพเดตเอนทิตีอัตโนมัติอีกต่อไป เมื่อใดก็ตามที่จำเป็นต้องสร้างเปลี่ยนชนิดหรือกำหนดเอนทิตีที่เก็บข้อมูลของเอนทิตีต้องดำเนินการด้วยฟังก์ชั่นอัปเดตที่ชัดเจนซึ่งจัดทำโดย Update API และใช้ API ที่มีให้โดยผู้จัดการอัพเดตข้อกำหนดของเอนทิตี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.