一、Drupal 版本兼容性
目标版本:Drupal 11.x
最低源版本:Drupal 10.3.x
二、先决条件
在开始升级之前,请确保您的环境和站点满足以下要求:
托管环境:必须满足 Drupal 11 的平台要求。
当前版本:站点必须运行 Drupal 10.3.0 或更高版本。Drupal 11 中已移除 10.3.0 之前的所有核心更新。
访问权限:具有命令行访问权限,并安装了 Composer 和 Drush。
权限:能够在服务器上修改文件权限(chmod)。
PHP:8.3.0 或更高版本。
1. 准备升级
管理脚手架文件和弃用功能
所有 Drupal 核心文件(包括 .htaccess)都将更改。如果您自定义了脚手架文件,请记录您的更改以便稍后重新应用。
示例:Drupal 11 移除了 Statistics 模块。如果您在 .htaccess 中有自定义的 Statistics 规则,应将其移除,因为现在由贡献模块处理其自身的保护。
处理核心模块和主题
多个模块在 Drupal 10 中已弃用,并在 Drupal 11 中移除:
已移除的扩展:Actions UI、Activity Tracker、Book、Forum、Statistics 和 Tour。
已过时的扩展:单目录组件(SDC)和帮助主题(功能已移至核心)。
处理已移除模块的选项:
在 Drupal 10 中停止使用该模块,然后再升级。
在执行 Drupal 11 代码升级前,在 Drupal 10.3+ 中安装该模块的贡献版本。
2. 更新贡献代码和自定义代码
使用升级状态模块检查兼容性
使用 Upgrade Status 模块来识别兼容性差距。
要将模块更新到特定版本(例如,drupal/webform),请运行:
composer require drupal/webform:^6.2 --no-update
如果找不到兼容版本:
查看模块的问题队列,寻找 Drupal 11 补丁。阅读“创建 Drupal 11 兼容性补丁”以获取更多提示。
对于需要补丁的模块,请使用 Drupal Lenient Composer 端点。
多版本兼容性:您可以在 composer.json 中允许多个版本来弥合差距。例如,将 "drupal/linkit": "^6.1" 更改为 "drupal/linkit": "^6.1 || ^7.0"。
注意:如果某个模块需要手动检查、补丁或社区协作,请参阅附录中的“不兼容的贡献模块”。
更新自定义代码
使用 Drupal Rector 和 Upgrade Status 来替换在 Drupal 10 中已弃用的代码。
清理(可选)
确认兼容性后,您可以移除 Upgrade Status 和 Drush(升级后重新安装 Drush):
drush pm:uninstall upgrade_status -y
composer remove drupal/upgrade_status --no-update
3. 执行升级至 Drupal 11
从 Drupal 根目录执行以下步骤。
步骤 1:开放文件权限
chmod u+w web/sites/default
chmod u+w web/sites/default/*settings.php
chmod u+w web/sites/default/*services.yml
步骤 2:更新核心依赖项
我们使用 --no-update 来在准备需求时防止依赖项冲突。
composer require 'drupal/core-recommended:^11' \
'drupal/core-composer-scaffold:^11' \
'drupal/core-project-message:^11' --no-update
如果 drupal/core 在您的 composer.json 中被显式列出,请将其移除:
composer remove drupal/core --no-update
更新开发工具和 Drush:
composer require 'drupal/core-dev:^11' --dev --no-update
composer require 'drush/drush:^13' --no-update
步骤 3:运行更新
首先,执行空跑(dry-run)以检查错误:
composer update --dry-run
如果成功,执行实际更新:
composer update
注意:要仅更新核心和 Drush,请使用:
composer update "drupal/core-*" drush/drush --with-all-dependencies
步骤 4:验证和数据库更新
确保环境一致性:
composer install
运行待处理的数据库更新:
drush updatedb:status
drush updatedb
步骤 5:恢复权限
chmod 755 web/sites/default
chmod 644 web/sites/default/*settings.php
chmod 644 web/sites/default/*services.yml
4. 升级后任务
导出配置:升级通常会更改配置架构或排序:
drush config:export
代码标准:运行 PHP CodeSniffer 以符合 Drupal 11 编码标准。
测试:
运行自动化测试(PHPUnit/Behat)。
在浏览时监控日志:
drush watchdog:tail
运行 cron:
drush cron
三、遗留内容与附录
1、不兼容的贡献模块
如果 Upgrade Status 报告有贡献模块尚不兼容 Drupal 11,有几种可能的解决路径:
手动验证:Upgrade Status 很有帮助,但并非完美。手动检查是否存在该报告可能未识别出的 Drupal 11 兼容版本。通过 Composer 显式要求该模块:
composer require drupal/MODULE_NAME:^VERSION --no-update
应用补丁:在模块项目的问题队列中寻找提供兼容性的补丁。有关处理仅在本地打补丁的版本约束的详细信息,请参阅 Lenient Composer 文档。
与维护者合作:如果没有版本或补丁存在,请查看模块项目页面了解 Drupal 11 的计划。您可以提供帮助,或参考“创建 Drupal 11 兼容性补丁”获取提示。
2、常见问题
依赖项解析失败:如果 composer update 失败,请尝试重置所有约束:
composer show --no-dev --direct --name-only | xargs composer require --no-update
识别阻塞因素:
composer why-not drupal/core ^11
补丁损坏:如果使用 cweagans/composer-patches,请检查补丁是否已合并到核心中,或者是否需要为 Drupal 11 更新版本。
锁定文件警告:如果锁定文件不同步,请删除 composer.lock 和 vendor 文件夹,然后运行 composer update。
3、支持资源
项目更新工作组(PUWG):加入 Drupal Slack 上的 #project-update-working-group 频道,或访问 PUWG 项目页面。
在 Drupalize.me 上升级到 Drupal 11。

