Qual é o objetivo das atualizações de entidade drush?

14

Depois de atualizar os módulos do Drupal 8, fui avisado na página de status do Drupal 8 que:

Definições de entidade / campo: As seguintes alterações foram detectadas no tipo de entidade e nas definições de campo.

Depois de um pouco de pesquisa no Google, parece que a solução é executar drush entity-updates. No entanto, acho isso um pouco estranho, pois parece ser outro comando que é necessário lembrar ou incorporar ao fluxo de trabalho após a atualização do banco de dados, sem mencionar que não parecia imediatamente óbvio sobre como lidar com o aviso original.

Além disso, é comum o desenvolvimento de um alerta para outras ações na página Status, o que significa que você não saberá imediatamente se precisa agir sobre isso.

Alguém pode explicar para que serve esse aviso - ou melhor, por que esse recurso foi introduzido no D8 e por que ele não é fatorado na operação de atualização do banco de dados, mas deve ser executado separadamente?

njp
fonte

Respostas:

19

drush entity-updatesé uma ferramenta de desenvolvedor. Se você alterar as definições de entidade / campo em seu módulo personalizado, poderá aplicá-lo rapidamente.

Na produção, isso não deveria acontecer. Se você atualizar um módulo entre os releases oficiais, o código de atualização no módulo deverá tratar disso.

Mas no seu caso, você está mencionando que seu site está em desenvolvimento. Portanto, há muitas coisas que poderiam ter causado isso. No seu próprio código ou nas versões dev ou alpha dos módulos contrib.

Encontrei este exemplo nas funções de atualização de gravação de CR para atualizações de esquema de entidade, automação removida (onde há mais exemplos):

/**
 * 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
fonte
2
Exceto que esse é realmente um mau exemplo. se você é um módulo, deve fazer atualizações muito específicas. Instale uma nova definição de campo, atualize uma definição de tipo de entidade. Isso pode ser muito ruim se você atualizar vários módulos ou se o módulo fizer outra alteração no futuro e você atualizar a partir de uma versão antiga. O node.install possui vários exemplos melhores de atualização.
Berdir
1
Inicialmente, isso foi feito automaticamente como parte do updb / update.php. Mas nem sempre funciona, não suporta atualizações possivelmente destrutivas quando há dados e isso causou muitos problemas. Se você possui dados em um campo, não pode simplesmente chamar esse método, é necessário atualizá-lo, o que pode ser bastante complicado. Veja drupal.org/node/2554097 para obter mais informações
Berdir 23/11/16
2
Nota sobre o comentário de Berdir: removi o mau exemplo e o substituí por um do registro de alterações.
217 Andy
2
Só para esclarecer, a razão pela qual é uma má ideia executar atualizações de entidade na produção é que ela pode ser destrutiva. Por exemplo, se você alterar um uuid de armazenamento de campo, importar a definição de armazenamento alterada, executar cron e depois executar atualizações de entidade, ele destruirá qualquer conteúdo existente nesse campo.
Dane Powell
2
Os módulos devem ser responsáveis ​​por aplicar suas próprias atualizações de esquema por meio de ganchos de atualização direcionados. Ninguém deve executar o entity-updatescomando regularmente, exceto no início do processo de desenvolvimento de sites com módulos personalizados nos quais você não se importa com a destruição de dados.
Dane Powell
1

O comando "drush entity-updates" foi removido da v 8.7.0

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

A partir do 8.7.0, o núcleo do Drupal não fornece mais suporte para atualizações automáticas de entidades. Sempre que um tipo de entidade ou definição de armazenamento de campo precisa ser criada, alterada ou excluída, isso deve ser feito com uma função de atualização explícita, conforme fornecida pela API de atualização, e usando a API fornecida pelo gerenciador de atualização de definição de entidade.

Andriyun
fonte