Drush 엔티티 업데이트의 목적은 무엇입니까?


14

Drupal 8 모듈을 업데이트 한 후 Drupal 8 상태 페이지에서 다음과 같은 경고를 받았습니다.

엔티티 / 필드 정의 : 엔티티 유형 및 필드 정의에서 다음 변경 사항이 감지되었습니다.

약간의 구글 rummaging 후, 이것에 대한 해결책은을 실행하는 것 같습니다 drush entity-updates. 그러나 데이터베이스를 업데이트 한 후 워크 플로우에 기억하거나 통합 해야하는 또 다른 명령 인 것처럼 보일 수 있습니다. 원래 경고를 해결하는 방법에 대해 즉시 명백하지 않은 것은 말할 것도 없습니다.

또한 개발시 상태 페이지에 다른 작업에 대한 경고가 표시되는 경우가 종종 있는데,이 작업을 수행해야하는지 즉시 알 수 없습니다.

누구든지이 경고가 무엇인지 설명 할 수 있습니까? 아니면 왜이 기능이 D8에 도입되었으며 왜 데이터베이스 업데이트 작업에 포함되지 않습니까?

답변:


19

drush entity-updates개발자 도구입니다. 사용자 정의 모듈에서 엔티티 / 필드 정의를 변경하면이를 빠르게 적용 할 수 있습니다.

생산에서는 이런 일이 발생하지 않아야합니다. 공식 릴리스 사이에서 모듈을 업데이트하는 경우 모듈의 업데이트 코드가이를 처리해야합니다.

그러나 귀하의 경우 귀하의 사이트가 개발 중이라고 언급하고 있습니다. 따라서 많은 원인이 있습니다. 자체 코드 또는 개발 또는 알파 버전의 contrib 모듈 중 하나입니다.

CR 에서이 예를 찾았습니다. 엔터티 스키마 업데이트에 대한 쓰기 업데이트 기능 으며 자동화가 제거되었습니다 (추가 예제가있는 경우).

/**
 * 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을 실행 한 다음 엔티티 업데이트를 실행하면 해당 필드의 기존 컨텐츠가 모두 삭제됩니다.
데인 파월

2
모듈은 대상 업데이트 후크를 통해 자체 스키마 업데이트를 적용해야합니다. entity-updates데이터 삭제에 신경 쓰지 않는 사용자 정의 모듈이있는 사이트의 초기 개발 프로세스를 제외하고 는 아무도 정기적으로 명령을 실행해서는 안됩니다 .
Dane Powell

1

"drush entity-updates"명령이 v 8.7.0에서 제거되었습니다.

참조 https://www.drupal.org/node/3034742를

8.7.0부터 Drupal 코어는 더 이상 자동 엔티티 업데이트를 지원하지 않습니다. 엔티티 유형 또는 필드 스토리지 정의를 작성, 변경 또는 삭제해야 할 때마다 업데이트 API에서 제공 한 명시 적 업데이트 기능 및 엔티티 정의 업데이트 관리자에서 제공 한 API를 사용하여 수행해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.