如何从 Drupal 10 升级到 Drupal 11

一、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。

联系我们

提供基于Drupal的门户网站、电子商务网站、移动应用开发及托管服务

长按加微信
长风云微信
长按关注公众号
长风云公众号