RESOLVIDO: os recursos do Drupal não serão revertidos se o arquivo .module não contiver a instrução include_once para o arquivo features.inc

Problema / Motivação

Além do comentário nº 80 neste link ( http://drupal.org/node/744450#comment-6320242 ), há muitos motivos pelos quais um recurso pode não ser revertido. No entanto, descrito aqui é um motivo muito comum. Você pode estar trabalhando em uma nova funcionalidade, mas está chegando ao fim do dia, então você define o que tem e o compromete. Tudo o que você adicionou foi um campo ou uma permissão (ou algo que não gerou um arquivo .features.inc). Isso significa que o arquivo .module foi gerado SEM um “.features.inc “(que está bom por enquanto – o recurso funciona). Amanhã, você continuará seu trabalho e adicionará um monte de outras coisas ao recurso, como uma visualização e, em seguida, recriará seu recurso. Você percebeu isso hora em que um arquivo * .features.inc é gerado – ótimo; isso é esperado. O que você pode não notar hoje é que o arquivo .module nunca foi atualizado com a linha include once ‘my module.features.inc’ necessária em para que esse recurso seja revertido adequadamente, caso seja substituído.

Isso é totalmente esperado com base no código atualmente na versão estável de recursos (7.x-1.0). As linhas 276-310 de features.export.inc descrevem os comportamentos que ocorrem se o módulo estiver sendo criado recentemente ou recriado e NÃO adicionar a linha ausente. Ele só será adicionado se o recurso estiver sendo criado recentemente; caso contrário, ele simplesmente o deixa sozinho.

Resolução proposta

Uma adição manual do que está faltando inclui ‘test feature.features.inc’; declaração na parte superior do arquivo test_feature.module corrigirá isso para qualquer pessoa que não pode usar um patch, mas seria preferível que os recursos fizessem isso por padrão no código.

Parece haver 2 maneiras de resolver esse problema:
1. Adicione a instrução include no arquivo .module se uma recriação subsequente de um recurso exigir o arquivo features.inc.
2. Sempre inclua um arquivo features.inc, mesmo se estiver vazio.

Escolhi a primeira abordagem por dois motivos. Presumi que, como o arquivo features.inc não está incluído, a menos que certos tipos de componentes sejam caracterizados, há uma razão para isso. Em segundo lugar, minha abordagem toca menos código no módulo do que a segunda opção faria e, portanto, menos possibilidade de erro e / ou regressão.

O patch verifica a posição do primeiro docblock na parte superior do arquivo .module e insere a instrução include once depois disso. Este patch foi criado propositalmente para ser ligeiramente tolerante e não procurar especificamente por um docblock @code no caso de um desenvolvedor ter removido isso. Em vez disso, é realizada uma busca pelo primeiro comentário genérico de várias linhas. Se não conseguir encontrar um resultado, ele simplesmente o insere no topo do arquivo após a primeira tag <? Php de abertura. Se por algum motivo o arquivo .module foi completamente destruído e está apenas vazio, ele recorre ao mesmo erro de registro de recursos que a versão estável atual usa e não modifica o código de recurso que está sendo gerado.

A seguir estão as etapas para reproduzir o problema sem um patch no local.

  • Gere um novo recurso de teste muito simples com algo muito simples que não gera um arquivo * .features.inc (como uma permissão e um campo). Este exemplo exato produzirá um recurso que contém algo muito semelhante a:
  • um arquivo test_feature.info
  • um arquivo test_feature.module
  • um arquivo de teste feature.features.user permission.inc
  • um arquivo test_feature.features.features.field.inc

  • Implante e ative este recurso em um ambiente ativo.

  • Volte para a página de recursos e vá para a guia “Recriar”.

  • Adicione um componente adicional que gere este arquivo test_feature.features.inc, como uma visualização.

  • Baixe uma nova cópia do recurso de teste . Você verá um arquivo de teste feature.features.inc desta vez como parte do download.

  • Atualize seu recurso implantado para esta nova versão.

  • Na próxima página de carregamento de sua IU, você verá uma mensagem “test feature.module não parece incluir o arquivo test feature.features.inc”.

  • A verificação dupla do conteúdo de test feature.module realmente confirmará que ele não foi atualizado para ter a instrução include once que inclui o arquivo test_feature.features.inc.

  • O recurso pode já estar no estado substituído apenas como resultado disso, mas se não estiver; faça uma alteração na visualização para colocar o recurso no estado substituído. As tentativas de usar a IU ou drush para reverter esse recurso falharão e o recurso permanecerá no estado substituído.

Quer o patch para corrigir isso? Disponível em http://drupal.org/node/1875888#comment-6884362 . Talvez ele chegue na próxima versão estável do módulo de recursos!