Como mover os módulos instalados de / sites / all / modules / * para / sites / all / contrib / modules / *


34

Eu tenho procurado as respostas para esta pergunta sem sorte alguma. Pelo que observo na estrutura do banco de dados, a localização dos módulos é especificada na tabela 'sistema'. A única solução que tenho é escrever uma consulta SQL para atualizar a coluna 'filename'.

Existe uma solução melhor / mais limpa para resolver isso, por exemplo, um módulo de contribuição?

Respostas:


27

Você só precisa mover seus módulos para o seu novo local e reconstruir o registro. Quando o registro recriar, o caminho para os módulos será atualizado. Verifique registry_rebuild().

Recupera todo o código em módulos ou inclui diretórios, armazenando o local de cada interface ou classe no banco de dados.

Embora, eu recomendo que você faça backup do banco de dados antes de testar isso.

Se você estiver usando drush, também poderá recriar o registro usando o seguinte comando:

drush cc registry

Você também pode instalar o registry_rebuildcomando drush:

// install registry_rebuild
drush dl registry_rebuild
// rebuild the registry
drush rr

Se eu entendi corretamente, você também pode truncar sua registry_filetabela, o que forçará o drupal a verificar novamente todos os arquivos e reconstruir a tabela.
Cyclonecode

3
Truncar a tabela parece uma péssima idéia e provavelmente resultará em um site totalmente quebrado.
Berdir

@Berdir - Concorde que parece uma má ideia. Mas, apenas tentei e parece funcionar. Primeiro, fiz um backup e truncou a tabela inteira usando DELETE FROM registry_file;e adicionei uma chamada rebuild_registry()no meu page.tpl.php.
Cyclonecode

Isso é complicado demais, basta fazer o que John Laine disse, sempre funcionou para mim.
Jim Kirkpatrick

1
@JimKirkpatrick - Você está certo, não há necessidade de desativar os módulos.
Cyclonecode

10

Eu restaurei um backup da produção localmente e tentei apenas mover as coisas e pressionar admin / modules ou executar o registry_rebuild (), mas isso não impediu que erros fatais fossem lançados. Isso faz sentido para mim, já que alguns módulos podem usar include ou o que quer que seja em seu hook_init (), ou você pode ter um caminho de roteador de menu definido que depende de um módulo ou que o Drupal não pode encontrar no bootstrap. Por fim, foi o que eu fiz (seus caminhos podem ser diferentes):

Etapa 1: Substitua sites / all / modules por sites / all / modules / contrib

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules', 'sites/all/modules/contrib');

Etapa 2: Substitua sites / all / modules / contrib por sites / all / modules / custom para módulos personalizados no namespace

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE name LIKE 'my_custom_namespace_%';
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE name LIKE 'my_custom_namespace_%';
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/custom') WHERE filename LIKE '%my_custom_namespace_%';

Etapa 3: Mova os módulos de desenvolvimento para sites / all / modules / dev

UPDATE system SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE name LIKE 'devel%';
UPDATE registry SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE name LIKE 'devel%';
UPDATE registry_file SET filename = REPLACE(filename, 'sites/all/modules/contrib', 'sites/all/modules/dev') WHERE filename LIKE '%devel%';

Etapa 4: limpe os caches para que as coisas sejam inicializadas corretamente

TRUNCATE TABLE cache
TRUNCATE TABLE cache_bootstrap
TRUNCATE TABLE cache_menu
TRUNCATE TABLE cache_page
TRUNCATE TABLE cache_path

Nota: Se você usar um módulo personalizado ou um contrib como o LoginToboggan para manipular 403 (acesso negado) e você for desconectado durante esse processo, talvez seja necessário atualizar a include_filecoluna na menu_rotertabela para usar o novo caminho para o arquivo de inclusão . Provavelmente é uma ocorrência rara.

UPDATE menu_router SET include_file = 'sites/all/modules/custom/my_custom_namespace/includes/foo.inc' WHERE path = 'access-denied'

Depois que essas consultas forem executadas - o que levará apenas uma fração de segundo -, pressione admin / config / development / performance e limpe o cache para que os caminhos do menu sejam reconstruídos.


Obrigado por isso! Tentei as etapas mencionadas nas principais respostas, mas isso não ajudou no meu caso. I alguém suspeito em um panteão hospedados necessidades do site para executar essas declarações db em sua resposta e, em seguida, fazer o "Drush Registro-reconstrução" e "Registro cc Drush"
Anne Bonham

Ah, e no Pantheon, eu não conseguia acessar o site com o módulo Redis em nenhum lugar além de sites / all / modules - então desisti e deixei esse módulo na pasta de módulos raiz. Ah, bem - pelo menos meus outros módulos estão bem organizados.
Anne Bonham

Para aqueles que usam LoginToboggan, aqui estão os 3 comandos do MySQL que você vai precisar:update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.admin.inc' WHERE path = 'admin/config/system/logintoboggan'; update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.validation.inc' WHERE path = 'toboggan/revalidate/%'; update menu_router set include_file = 'sites/all/modules/contrib/logintoboggan/logintoboggan.validation.inc' WHERE path = 'user/validate/%/%/%';
tyler.frankenstein

9

Experimente a ferramenta legal de Mark Sonnabaum: Drush Rebuild Project Paths . Automatiza o processo; funcionou muito bem para mim. Usa Drush , é claro.

Em segundo lugar, sugerirei que você tente fazer isso em uma cópia do banco de dados do site.


7

Para o registro, há um ótimo comando drush para reconstruir o registro: http://drupal.org/project/registry_rebuild

Há muitas informações na página do projeto.


Este é o meu método mais preferido de mover módulos. Eu tinha alguns módulos que estavam habilitados nos sites/all/modulesquais tinham que ser movidos para o contribsubdiretório. Tudo o que eu precisava eradrush dl registry_rebuild; mv OLD_PATH/module NEW_PATH/module; drush rr
Sumeet Pareek

Isso funcionou para mim. Mudei todos os meus módulos primeiro e, em seguida, fiz o registry_rebuild
gerl 4/14

Curiosamente, drush rr --fire-bazookaleva a erros, mas drush rrestá bem.
Alex Skrypnyk

5

Em primeiro lugar, sempre faça backup do seu banco de dados, de maneira simples, você se chutará se algo der errado e você não fez o backup.

Não tenho certeza se isso importa se você desabilita os módulos ou não; você pode querer fazê-lo, apenas por precaução. Então faça o seguinte:

  1. Coloque seu site no modo de manutenção em (sitename) / admin / config / development / maintenance
  2. Mova fisicamente seus módulos no sistema de arquivos.
  3. Limpe seus caches em (sitename) / admin / config / development / performance ou apenas salve novamente a página dos módulos.

Tudo feito! O Drupal irá procurar todos os módulos instalados.


+1 para o modo maintaince, sempre bom fazer isto antes de qualquer outra coisa semelhante
Cyclonecode

1
Isso causa erros fatais 100% do tempo para mim. Talvez funcione se você mover módulos que não possuem dependências ou algo assim.
precisa saber é o seguinte

4

Por que você não tenta o módulo Registry Rebuild ? Funcionou toda vez para mim.

Aqui está uma citação sobre ele (na página do projeto do módulo):

Há momentos no Drupal 7 em que o registro fica irremediavelmente manguito e você precisa reconstruí-lo (uma lista de classes PHP e os arquivos com os quais eles acompanham). Às vezes, porém, você não pode executar esta atividade regular de limpeza de cache, porque alguma classe é necessária quando o sistema está tentando inicializar.


Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência. Se houver um procedimento para mover módulos que inclua o uso do módulo vinculado, descreva-o.
Mołot

Nenhuma teoria ... funciona. Siga as instruções na página. Eu usei o método drush e funcionou.
ILLin

3

Você pode usar o módulo Registry Rebuild , que se integra ao Drush por meio do Drush RRcomando

Basicamente, o que você faz são estas etapas:

  1. Mova seus módulos para outro diretório e
  2. A Reconstrução do Registro reconstruirá a tabela do sistema para colocar os módulos no lugar certo.

Eu o aprendi / descobri pela primeira vez através do DrupalEasy Podcast # 133 , que explica mais detalhadamente como esse módulo / drush cmd pode ser usado.

PS: Claro, primeiro faça um backup do seu site ...


3
Eu segundo isso. Faça backup do site. Mova todos os módulos para novas pastas. Execute a reconstrução do registro no drush, ou apenas siga as instruções e navegue até o arquivo php incluído para executá-lo. Simples.
Collins

2

Visite / admin / build / modules, ele reconstruirá os caminhos na tabela do sistema. Às vezes, o drupal não pode mais inicializar, então essa solução não funciona nesse caso. Se não funcionar, você pode usar o Drush Rebuild Project Paths como dito em uma resposta anterior. Você precisa adicionar o novo comando drush antes de interromper a inicialização. Para adicionar o novo comando, consulte a seção COMMANDS do readme


2

Eu tive alguns problemas ao drush dlnão trabalhar devido aos problemas de diretório do módulo. Geralmente eu gosto de respostas de pilha que eu posso simplesmente colar para fazer as coisas funcionarem. Aqui você encontra algumas linhas que instalam o Drush Rebuild Registry e o executam no seu site, se você já estiver no diretório do site apropriado.

pushd ~  # good if drush on your site is broken because of moved modules
drush dl -y registry_rebuild
popd 
drush rr

2

Não tenho 100% de certeza sobre uma resposta drupal-esk verdadeira, mas na minha experiência:

Mudei acidentalmente uma das minhas pastas de módulo personalizadas para outra pasta de módulo personalizado ao enviar FTP para o servidor. Os dois ainda trabalhavam. Drupal parecia tê-lo reconhecido como um módulo separado, mesmo enquanto estava na pasta de outro módulo. Não precisei desativar o módulo.

** Este módulo que eu mudei NÃO tinha um arquivo .install, então não tenho certeza se isso importa.


O arquivo de instalação é apenas para procedimentos chamados durante a instalação do módulo e não é um requisito. Funcionou porque você pode ter qualquer estrutura de pastas em / sites / all / modules, o drupal procurará os arquivos .info recursivamente.
gbyte.co

@ gbyte.co obrigado pelo esclarecimento sobre isso! Eu sabia sobre o arquivo de instalação, mas não conhecia o processo recursivo do drupal de procurar arquivos .info. Achei que não importava em qual subpasta eles estavam, mas é bom ter uma resposta sólida!
Exziled

1

As distribuições do Drupal não lidam bem com isso; recentemente, depois de terminar acidentalmente com uma cópia da API da entidade em sites/all/um site do Panopoly, nada disso funcionou. A reconstrução do registro, o carregamento da página de módulos e tudo o mais causou um erro fatal.

Desabilitar o módulo também não é simples, se você precisar mover algo como a API de entidade, exigido por muitos outros módulos no Panopoly.

Para resolver isso, para a API de entidade, você faria algo assim:

  1. Atualize o caminho na tabela do sistema:

    UPDATE `system` 
      SET `filename` = REPLACE(
        `filename`, 
        'sites/all/modules/entity', 
        'profiles/panopoly/modules/contrib/entity'
      );
  2. Em seguida, recrie o registro:

    drush rr

1

Drupal 7

Primeiro de tudo, tente drush rr.

Se não funcionar, depois de mover os arquivos, tente os seguintes comandos Drush no diretório raiz do Drupal:

drush sqlq "TRUNCATE cache; TRUNCATE cache_bootstrap;"
php -r "define('DRUPAL_ROOT', getcwd()); require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION); registry_rebuild(); registry_update(); cache_clear_all();"
drush -y cc all

Se acima não funcionar, encontre a tabela que ainda possui as informações antigas sobre o caminho:

drush --ordered-dump sql-dump | grep "sites/all/modules" # Change the path to the old one.

Se nenhum for encontrado, isso significa que é seu cache externo.

Nesse caso, não esqueça de reiniciá-los, por exemplo:

killall -HUP memcached
drush eval "function_exists('xcache_clear_cache') && xcache_clear_cache();"

Veja mais: Qual método é usado para limpar caches no Drupal?


Como alternativa, você pode tentar as seguintes consultas MySQL após mover os arquivos:

UPDATE system SET filename = REPLACE(filename, "sites/all/modules", "sites/newplace/modules") WHERE
       filename LIKE "sites/all/modules/%" AND type = "module"
       AND name IN ("my", "module", "whose", "path", "changed");

UPDATE registry SET filename = REPLACE(filename, "sites/all/modules", "sites/newplace/modules") WHERE
       filename LIKE "sites/all/modules/%"
       AND module IN  ("my", "module", "whose", "path", "changed");

1

É recomendável mover seus módulos para subpastas contrib / dev / patched / custom. No entanto, não há ganhos de desempenho, isso é feito por razões práticas e estéticas. Isso facilitará a vida de futuros desenvolvedores.

Você pode mover a maioria dos módulos contrib para subpastas sem problemas em um site ativo. Você deve limpar os caches posteriormente. Se você não usar drush e achar que não pode mais acessar a página de limpeza de cache, visite /update.php ou trunque manualmente as tabelas de cache. Eu só tive que fazer o último bit ao mover o módulo da API da entidade.

Mover módulos principais é tecnicamente possível, mas eu não o recomendaria nem vejo nenhuma razão válida para isso.

Atualização: A movimentação de módulos como a API da entidade pode exigir a reconstrução do registro. Confira a página registry_rebuild .


-4

Você pode simplesmente adicionar um link sym no diretório sites / all / modules apontando para sites / all / contrib. Não tenho certeza se isso resolve o seu problema. Também existem outras soluções, incluindo o perfil de instalação ou um arquivo make drush. Não sei o suficiente para fornecer detalhes sobre eles, mas pelo menos é uma direção que você pode olhar.


5
É uma dor de cabeça de manutenção a longo prazo
AgA 17/11/11

isso é um hack e contorna a correção ... não é uma boa solução.
ILLin 16/09/2015

sim, é muito melhor usar drush registry_rebuild agora que está disponível.
lexicant
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.