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!