如何将已安装的模块从/ sites / all / modules / *移至/ sites / all / contrib / modules / *


34

我一直在寻找这个问题的答案,一点都没有运气。根据我在数据库结构中观察到的,模块的位置在“系统”表中指定。我唯一的解决方案是编写一个SQL查询来更新“文件名”列。

是否有更好/更清洁的解决方案,例如contrib模块?

Answers:


27

您只需要将模块移动到新位置并重建注册表即可。注册表重建时,将更新模块的路径。检查registry_rebuild()

重新扫描模块中或包含目录的所有代码,将每个接口或类的位置存储在数据库中。

虽然,我建议您在测试之前备份数据库。

如果您使用的是drush,也可以使用以下命令重建注册表:

drush cc registry

您也可以安装registry_rebuilddrush命令:

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

如果我正确理解它,则也可以截断registry_file表,这将迫使drupal重新扫描所有文件并重建表。
Cyclonecode 2011年

3
截断桌子听起来是个坏主意,很可能会导致站点完全损坏。
伯迪尔2011年

@Berdir-同意这听起来是个坏主意。但是,只是尝试了一下,似乎奏效了。首先,我花了备份,并使用截断整个表DELETE FROM registry_file;,并增加了呼叫rebuild_registry()page.tpl.php
Cyclonecode 2011年

这太复杂了,就像约翰·莱恩(John Laine)所说的那样,它一直对我有用
吉姆·柯克帕特里克

1
@JimKirkpatrick-你是对的,不需要禁用模块。
Cyclonecode 2012年

10

我从本地生产环境中恢复了一个备份,并试图移动某些东西并命中admin / modules或运行registry_rebuild(),但它并没有阻止引发致命错误。这对我来说很有意义,因为某些模块可能在其hook_init()中使用了include或其他内容,或者您​​可能设置了依赖于模块的菜单路由器路径集或Drupal在引导程序中找不到的include路由器。最终,这就是我所做的(您的路径可能不同):

第1步:将网站/所有/模块替换为网站/所有/模块/贡献

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');

步骤2:将site / all / modules / contrib替换为site / all / modules / custom的自定义命名空间模块

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_%';

步骤3:将开发人员模块移至site / 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%';

第4步:清除缓存,以便正确引导

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

注意:如果您使用自定义模块或诸如LoginToboggan之类的工具来处理403(拒绝访问),并且在此过程中已注销,则可能需要更新表中的include_filemenu_roter以使用包含文件的新路径。这可能是罕见的情况。

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

一旦运行了这些查询(仅需一秒钟),请点击admin / config / development / performance并清除缓存,以便重新构建菜单路径。


谢谢你!我尝试了最佳答案中提到的步骤,但对我的情况没有帮助。我怀疑在万神殿托管站点上的任何人都需要在您的答案中执行这些数据库语句,然后执行“ Drush Registry-Rebuild”和“ Drush CC Registry”
Anne Bonham

哦,在万神殿上,除了sites / all / modules之外,我无法在Redis模块上建立站点-因此,我只是放弃了这个模块,并将其留在了根模块文件夹中。很好-至少我的其他模块井井有条。
安妮·伯翰

对于使用LoginToboggan的用户,这是您需要的3条MySQL命令: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 '18


7

作为记录,有一个很棒的drush命令来重建注册表:http ://drupal.org/project/registry_rebuild

项目页面中有很多信息。


这是我最喜欢的移动模块的方法。我有一些已启用的模块,这些模块sites/all/modules必须移至contrib子目录。我所drush dl registry_rebuild; mv OLD_PATH/module NEW_PATH/module; drush rr
要做的

这对我有用。我先移动了所有模块,然后进行了Registry_rebuild
gerl 2014年

有趣的是,drush rr --fire-bazooka会导致错误,但是drush rr很好。
Alex Skrypnyk '16

5

首先,请始终备份数据库,这样做很简单,如果出现问题并且没有备份,您会踢自己。

我不确定是否禁用模块是否重要;您可能要这样做,以防万一。然后执行以下操作:

  1. 将站点置于(站点名称)/ admin / config / development / maintenance的维护模式
  2. 在模块中物理移动模块。
  3. 在(站点名称)/ admin / config / development / performance清除缓存,或者只是重新保存模块页面。

全部做完!Drupal将重新搜索所有已安装的模块。


为维护模式+1,总是很高兴在这样的事情之前做这件事
Cyclonecode'1

1
这会对我造成100%的致命错误。如果您移动不具有依赖项或其他内容的模块,则可能会起作用。
ergophobe 2014年

4

您为什么不尝试注册表重建模块。每次都对我有用。

这是关于它的报价(来自模块的项目页面):

在Drupal 7中,有时注册表无法正常工作,您需要重建注册表(PHP类及其附带的文件的列表)。但是,有时您无法执行此常规的清除缓存操作,因为在系统尝试引导时需要某些类。


虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果有一个移动模块的过程,包括使用您链接的模块,请对其进行描述。
Mołot

没有理论……行得通。请按照页面上的说明进行操作。我使用了drush方法,它才起作用。
iLLin

3

您可以使用注册表重建模块,该模块通过Drush RR命令与Drush集成。

基本上,您需要执行以下步骤:

  1. 将模块移到另一个目录,然后
  2. 然后,Registry Rebuild将重建系统表,以将模块放置在正确的位置。

我首先通过DrupalEasy Podcast#133学习/发现它,它进一步说明了如何使用此模块/ drush cmd。

PS:当然,首先要对您的网站进行备份...


3
我第二。备份网站。将所有模块移到新文件夹中。在drush中运行注册表重建,或者只是按照说明进行操作,并导航到包含的php文件以运行它。简单。
柯林斯

2

访问/ admin / build / modules,它将重建系统表中的路径。有时drupal不能再引导,因此这种解决方案在这种情况下不起作用。如果它不起作用,则可以使用 上一个答案中所述的Drush Rebuild Project Paths。不过,您必须在中断引导程序之前添加新的drush命令。要添加新命令,请查看自述文件的 “命令”部分


2

drush dl由于模块目录问题,我在无法正常工作时遇到了一些麻烦。通常,我喜欢堆栈答案,只需将其粘贴即可使工作正常。在这里,您会找到几行内容,它们将安装Drush Rebuild Registry,如果您已经在正确的站点目录中,则可以在您的站点上运行它。

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

2

我不确定100%的真实drupal-esk答案,但根据我的经验:

通过FTP传输到服务器时,我不小心将一个自定义模块文件夹移动到了另一个自定义模块文件夹中。他们俩仍然工作。即使它在另一个模块的文件夹中,Drupal似乎也已经将其识别为一个单独的模块。我不必禁用该模块。

**我移动的该模块没有.install文件,因此不确定是否重要。


安装文件仅适用于模块安装过程中调用的过程,不是必需的。之所以起作用,是因为您可以在/ sites / all / modules下拥有任何文件夹结构,因此drupal将以递归方式查找.info文件。
gbyte.co 2015年

@ gbyte.co感谢您的澄清!我知道安装文件,但不知道drupal搜索.info文件的递归过程。我认为它们位于哪个子文件夹并不重要,但是有一个可靠的答案是很好的!
2015年

1

Drupal发行版不能很好地解决这个问题,因此最近在无意中在Panopoly网站上获得了Entity API副本后sites/all/,这些都没有用。注册表重建,加载模块页面以及其他所有内容均导致致命错误。

如果您必须移动诸如Entity API之类的东西,而Panopoly中的其他许多模块都需要,则禁用该模块并不简单。

为了解决这个问题,对于Entity API,您可以执行以下操作:

  1. 更新系统表中的路径:

    UPDATE `system` 
      SET `filename` = REPLACE(
        `filename`, 
        'sites/all/modules/entity', 
        'profiles/panopoly/modules/contrib/entity'
      );
  2. 然后重建注册表:

    drush rr

1

Drupal 7

首先试试drush rr

如果不起作用,请在移动文件后在Drupal根目录中尝试以下Drush命令:

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

如果上述方法不起作用,请通过以下方法找到仍包含有关路径的旧信息的表:

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

如果未找到,则意味着它是您的外部缓存。

如果是这样,请不要忘记重新启动它们,例如:

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

查看更多:在Drupal中使用什么方法清除缓存?


或者,您可以在移动文件后尝试以下MySQL查询:

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

建议将模块移动到contrib / dev / patched / custom子文件夹中。但是,没有性能提升,这是出于实用和美观的原因。这将使将来的开发人员的生活更加轻松。

您可以在实时站点上毫无问题地将大多数contrib模块移动到子文件夹。之后,您应该清除缓存。如果您不使用drush并发现无法再访问缓存清除页面,则必须访问/update.php或手动截断缓存表。移动实体API模块时,我只需要做最后一件事。

从技术上讲,可以移动核心模块,但是我不建议这样做,也没有看到任何有效的理由。

更新:移动诸如实体API之类的模块可能需要重建注册表。签出registry_rebuild页面。


-4

您可以只在指向sites / all / contrib的sites / all / modules目录中添加一个符号链接。我不确定是否能解决您的问题。还有其他解决方案,包括安装配置文件或草编文件。我还不了解有关它们的详细信息,但至少这是您可以参考的方向。


5
从长远来看,这是维护方面的头疼
AgA 2011年

这是一个hack,可以解决问题……不是一个好的解决方案。
iLLin

是的,现在可以使用drush Registry_rebuild更好。
词汇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.