Drupal - 移动模块文件夹

14

我可以将我的模块

  • sites/all/modules/
  • 移动到sites/all/modules/contribsites/all/modules/custom

在生产网站上这样做安全吗?

也就是说,Drupal是否会自动检测到模块仍然存在,但位于新路径中?

10个回答

21

Drupal 6及以下版本将模块位置保存在系统表中,但从Drupal 7开始,路径记录在多个地方(例如registryregistry_file表)中,因此仅移动文件夹并清除缓存是行不通的,很可能会导致严重问题。

您可以尝试以下步骤:

  1. 备份数据库
  2. 将代码提交到版本控制
  3. 运行以下查询:

    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')
    
  4. 移动文件夹

  5. 运行:drush cc all

当 (5) 出现错误(上下文出现错误)时,请尝试截断您所有的缓存%表。 - filsterjisah

3

对我来说,Irakli的回答很有效,但我想在查询中添加一些额外的复杂性,以便其他人也能找到它们。

步骤1-如果您很幸运,拥有共享命名空间的所有“自定义”模块,请更新它们:

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

第二步 - 更新所有“dev”模块:

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

第三步 - 更新所有“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')

然后将所有模块放入适当的 sites/all/modules/contrib|custom|dev 文件夹中,清除缓存,就可以开始使用了。


3
如果您移动一个模块,Drupal会发现旧的已经损坏,而新的已经存在。它不会假设这两个是相同的东西 - 只是被移动了。

2
如果您禁用模块,将其移动,然后在新位置重新启用它,那么应该没问题。它可能会保留其设置。如果您只是从 Drupal 下面拉出它,它不会喜欢这样的操作。 - McAden
2
步骤1:移动模块。步骤2:清除缓存。如果模块在此时仍然无法正常工作,则存在错误。 - Grayside
3
在Drupal 7中,移动模块后可能会遇到注册表问题。如果出现这种情况,请按照以下网址的说明操作:http://drupal.org/project/registry_rebuild。 - iainp999

2

Drupal将文件位置存储在系统表中,清除模块缓存后信息将被重建,因此如果您移动文件并在清除缓存后进行操作,则应该没有问题。


2

1

对于模块来说,拥有/contrib和/custom子文件夹是很好的。对于D7,特别是如果您使用实体,您应该禁用这些模块,将它们移动,然后重新启用。这样可以正常工作。

另一种方法是将模块移动到子文件夹中并清除缓存,但有时不起作用,可能会生成WSOD。


1

使用http://drupal.org/project/registry_rebuild。 "Registry Rebuild 还将重建系统表,以便正确放置模块,从而可以引导启动。"

  • 备份数据库
  • 上传 'module'
  • 移动所有的模块
  • 运行脚本 sites/all/modules/registry_rebuild/registry_rebuild.php
  • 重新加载网站
  • 如果出现错误,请清除浏览器缓存,然后一切都恢复正常

1

1
实际上,您只需要在系统表上进行更新,然后执行以下操作:
drush rr 

可能还有其他内容...

drush cc all

drush rr

0

如果您在之后清除缓存(drush cc all),则可以安全地移动大多数模块。

然而,一些模块,特别是ctools,在系统表或缓存以外的位置存储文件路径信息。您可能需要将这些模块保留在原始位置,但仍然可以移动其他所有内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接