Mục đích của cập nhật thực thể drush là gì?


14

Sau khi cập nhật các mô-đun Drupal 8, tôi đã được cảnh báo trên trang trạng thái Drupal 8 rằng:

Định nghĩa thực thể / trường: Các thay đổi sau được phát hiện trong loại thực thể và định nghĩa trường.

Sau một chút Google lục lọi, có vẻ như giải pháp cho việc này là chạy drush entity-updates. Tuy nhiên tôi thấy điều này hơi lạ vì dường như đó là một lệnh khác mà người ta cần nhớ hoặc kết hợp vào quy trình làm việc của một người sau khi cập nhật cơ sở dữ liệu, chưa kể có vẻ không rõ ràng về cách giải quyết cảnh báo ban đầu.

Hơn nữa, thông thường trong quá trình phát triển, bạn sẽ có cảnh báo cho các hành động khác trong trang Trạng thái, điều đó có nghĩa là bạn sẽ không biết ngay nếu bạn cần phải thực hiện việc này.

Bất cứ ai cũng có thể giải thích cảnh báo này là để làm gì - hay đúng hơn, tại sao tính năng này được đưa vào D8 và tại sao nó không được đưa vào hoạt động cập nhật cơ sở dữ liệu nhưng phải được chạy một cách riêng biệt?

Câu trả lời:


19

drush entity-updateslà một công cụ phát triển. Nếu bạn thay đổi định nghĩa thực thể / trường trong mô-đun tùy chỉnh, bạn có thể nhanh chóng áp dụng điều này.

Trong sản xuất điều này không nên xảy ra. Nếu bạn cập nhật một mô-đun giữa các bản phát hành chính thức, thì mã cập nhật trong mô-đun sẽ xử lý việc này.

Nhưng trong trường hợp của bạn, bạn đang đề cập rằng trang web của bạn đang phát triển. Vì vậy, có rất nhiều điều, có thể đã gây ra điều này. Hoặc trong mã của riêng bạn hoặc trong các phiên bản dev hoặc alpha của các mô-đun đóng góp.

Tôi đã tìm thấy ví dụ này từ các hàm cập nhật CR Write để cập nhật lược đồ thực thể, tự động loại bỏ (nơi có thêm ví dụ):

/**
 * 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
Ngoại trừ đó thực sự là một ví dụ xấu. Nếu bạn là một mô-đun, bạn nên cập nhật rất cụ thể. Cài đặt định nghĩa trường mới, cập nhật định nghĩa loại thực thể. Điều này có thể rất tệ nếu bạn cập nhật nhiều mô-đun hoặc nếu mô-đun sẽ thực hiện một thay đổi khác trong tương lai và bạn cập nhật từ một phiên bản cũ. node.install có một số ví dụ cập nhật tốt hơn.
Berdir

1
Ban đầu, điều này được thực hiện tự động như một phần của updb / update.php. Nhưng nó không luôn luôn hoạt động, nó không hỗ trợ các bản cập nhật có thể phá hủy khi có dữ liệu và điều đó gây ra rất nhiều vấn đề. Nếu bạn có dữ liệu trong một trường, bạn không thể gọi phương thức này, bạn cần tự cập nhật nó, việc này có thể khá phức tạp. Xem drupal.org/node/2554097 để biết thêm thông tin
Berdir

2
Lưu ý về nhận xét của Berdir: Tôi đã xóa ví dụ xấu và thay thế nó bằng một ví dụ từ hồ sơ thay đổi.
Andy

2
Rõ ràng, lý do mà nó là một ý tưởng tồi để chạy các bản cập nhật thực thể trong sản xuất là nó có thể mang tính hủy diệt. Ví dụ: nếu bạn thay đổi uuid lưu trữ trường, nhập định nghĩa lưu trữ đã thay đổi, chạy cron và sau đó chạy cập nhật thực thể, nó sẽ hủy mọi nội dung hiện có trong trường đó.
Dane Powell

2
Các mô-đun phải chịu trách nhiệm áp dụng các cập nhật lược đồ của riêng chúng thông qua các móc cập nhật được nhắm mục tiêu. Không ai nên chạy entity-updateslệnh một cách thường xuyên, ngoại trừ sớm trong quá trình phát triển các trang web với các mô-đun tùy chỉnh mà bạn không quan tâm đến việc hủy dữ liệu.
Dane Powell

1

Lệnh "cập nhật thực thể drush" đã bị xóa khỏi phiên bản 8.7.0

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

Bắt đầu với 8.7.0, lõi Drupal không còn hỗ trợ cập nhật thực thể tự động. Bất cứ khi nào một loại thực thể hoặc định nghĩa lưu trữ trường cần được tạo, thay đổi hoặc xóa, thì nó phải được thực hiện với chức năng cập nhật rõ ràng được cung cấp bởi API cập nhật và sử dụng API do trình quản lý cập nhật định nghĩa thực thể cung cấp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.