如何将已安装的模块从 /sites/all/modules/* 移动到 /sites/all/contrib/modules/*
-
22-10-2019 - |
题
我一直在寻找这个问题的答案,但没有任何运气。根据我在数据库结构中观察到的情况,模块的位置在“系统”表中指定。我唯一的解决方案是编写一个 SQL 查询来更新“文件名”列。
是否有更好/更干净的解决方案来解决这个问题,例如 contrib 模块?
解决方案
您只需要将模块移至新位置并重建瑞典。当注册表重建时,将更新模块的路径。查看 registry_rebuild()
.
在模块中解救所有代码或包括目录,将每个接口或类的位置存储在数据库中。
虽然,我建议您在对此进行测试之前备份数据库。
如果您使用的是Drush,也可以使用以下命令重建注册表:
drush cc registry
您也可以安装 registry_rebuild
Drush的命令:
// install registry_rebuild
drush dl registry_rebuild
// rebuild the registry
drush rr
其他提示
我从本地生产中恢复了备份,并尝试移动内容并点击管理/模块或运行registry_rebuild(),但它并没有阻止抛出致命错误。这对我来说很有意义,因为某些模块可能在其 hook_init() 中使用包含或其他内容,或者您可能有一个依赖于模块或包含 Drupal 在引导程序中找不到的菜单路由器路径集。最终,这就是我所做的(您的路径可能不同):
步骤1:将站点/所有/模块替换为站点/所有/模块/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');
第2步:将sites/all/modules/contrib 替换为sites/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:将开发模块移至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%';
步骤4:清除缓存以便正确引导
TRUNCATE TABLE cache
TRUNCATE TABLE cache_bootstrap
TRUNCATE TABLE cache_menu
TRUNCATE TABLE cache_page
TRUNCATE TABLE cache_path
笔记: 如果您使用自定义模块或像 LoginToboggan 这样的贡献来处理 403(访问被拒绝)并且您在此过程中已注销,则可能需要更新 include_file
栏目中的 menu_roter
表以使用包含文件的新路径。这可能是罕见的情况。
UPDATE menu_router SET include_file = 'sites/all/modules/custom/my_custom_namespace/includes/foo.inc' WHERE path = 'access-denied'
一旦这些查询运行完毕(只需要一瞬间),就可以点击管理/配置/开发/性能并清除缓存,以便重建菜单路径。
尝试Mark Sonnabaum的酷工具: Drush重建项目路径. 。它可以自动化该过程;对我来说很好。用途 drush, , 当然。
我将第二次建议您在网站数据库的副本上尝试此操作。
作为记录,有一个很棒的drush命令可以重建注册表: http://drupal.org/project/registry_rebuild
项目页面中有很多信息。
首先, 总是 备份您的数据库,如果出现问题并且没有备份,则可以简单地踢自己,您会踢自己。
我不确定是否禁用模块是否重要;您可能想这样做,以防万一。然后这样做:
- 将您的网站处于维护模式(SITENAME)/admin/config/development/维护
- 物理移动文件系统中的模块。
- 在(SiteName)/admin/config/development/performance上清除您的缓存,或者只是重新保存模块页面。
全部完成! Drupal将重新搜索所有已安装的模块。
你为什么不尝试 注册表重建 模块。它每次都为我工作。
这是关于它的报价(来自模块的项目页面):
在Drupal 7中,有时注册表毫无希望地进行软管,您需要重建注册表(PHP类列表及其所使用的文件)。不过,有时,您不能进行此常规的缓存活动活动,因为当系统试图引导程序时需要某些类。
您可以使用 注册表重建 模块,通过Drush通过 Drush RR
命令。
基本上您要做的是这些步骤:
- 将您的模块移至另一个目录,并且
- 然后,注册表将重建系统表,以使模块在正确的位置。
我首先通过 Drupaleasy播客#133, ,这进一步说明了如何使用此模块 / drush CMD。
PS:当然,首先执行您的网站备份...
访问/admin/build/模块将重建系统表中的路径。有时,Drupal再也无法引导,因此在这种情况下,该解决方案不起作用。如果不起作用,您可以使用 Drush重建项目路径 如先前的答案中所说。不过,您必须在打破引导程序之前添加新的drush命令。要添加新命令查看 读书我的命令部分
我遇到了一些麻烦 drush dl
由于模块目录问题不起作用。通常,我喜欢堆栈答案,我可以简单地粘贴以使事情正常工作。在这里,您可以找到几行,如果您已经在适当的站点目录中,可以在网站上安装Drush Recuild注册表并在网站上运行。
pushd ~ # good if drush on your site is broken because of moved modules
drush dl -y registry_rebuild
popd
drush rr
我不是100%确定真正的Drupal-esk答案,而是根据我的经验:
当Ftping到服务器时,我不小心将我的一个自定义模块文件夹移至另一个自定义模块文件夹中。他们俩仍然工作。即使在另一个模块的文件夹中,Drupal似乎也将其视为单独的模块。我不必禁用模块。
**我移动的这个模块没有.intall文件,因此我不确定这是否重要。
Drupal分布无法很好地处理,因此最近意外地获得了一份副本之后 实体API 在 sites/all/
在Panopoly网站上,这一切都没有起作用。注册表重建,加载模块页面以及其他所有内容都会导致致命错误。
如果您必须移动诸如Entity API之类的内容,那么禁用模块也不简单,这是Panopoly中其他大量模块所要求的。
为了解决这个问题,对于实体API,您会做这样的事情:
更新系统表中的路径:
UPDATE `system` SET `filename` = REPLACE( `filename`, 'sites/all/modules/entity', 'profiles/panopoly/modules/contrib/entity' );
然后重建注册表:
drush rr
Drupal 7
首先尝试 drush rr
.
如果它不起作用,则移动文件后,请在Drupal root dir中尝试以下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");
建议将模块移至 contrib/dev/patched/custom 子文件夹中。然而,没有性能提升,这是出于实用和美观的原因。这将使未来开发人员的生活变得更轻松。
您可以将大多数贡献模块移至子文件夹,而不会在实时站点上出现问题。之后您应该清除缓存。如果您不使用 drush 并发现无法再访问缓存清除页面,则必须访问 /update.php 或手动截断缓存表。在移动实体 API 模块时,我只需要做最后一点工作。
移动核心模块在技术上是可行的,但我不推荐这样做,也没有看到这样做的任何有效理由。
更新:移动实体 API 等模块可能需要重建注册表。查看 注册表重建 页。
您只需在网站/ALL/模块中添加一个SYM链接,将指向站点/ALL/COMPON的DIDETORY指向。我不确定它是否可以解决您的问题。还有其他解决方案,包括安装配置文件或Drush Make File。我不知道足够的细节,但至少这是您可以看到的方向。