使用Composer升级到Drupal 10(或者Drupal11)

Drupal的每一次升级都带来了大量的安全性改进、可靠性性改进,以及Drupal社区创建的一系列新功能。Drupal 10于2022年12月发布,带来了令人印象深刻的UI改进,为管理界面和默认主题带来了漂亮的更新。

自2015年8月推出Drupal 8以来,Drupal不断发展并添加新功能,使其与现代开发实践保持同步。Drupal 8中最大的变化之一是集成了基于PHP的依赖管理器Composer。Composer是一个功能强大的工具,可用于安装模块、升级Drupal,甚至检查项目中使用的模块和依赖关系之间的兼容性。了解如何利用Composer升级Drupal代码库是绝对必要的。幸运的是,Composer很容易掌握。

在本文中,我们将简要概述Composer如何在Composer.json和Composer.lock中跟踪项目的依赖关系。然后,我们将讨论如何利用Composer和社区构建的工具来确保您的代码与最新更新之间的兼容性。最后,我们将介绍使用Composer命令升级Drupal和解决冲突。

如果你运行的是Drupal 7等旧版本的Drupal,请查看这篇文章,了解如何将你的网站从Drupal 7升级到Drupal 8+。

一、composer的关键原则

Composer是一个基于PHP的依赖管理器,用于跟踪和下载Drupal模块、Symphony库,甚至Drupal核心本身。Composer使用语义版本控制来传达不同包版本之间的兼容性。主版本的更改(例如从Drupal 9.x到10.x)意味着开发人员在升级项目时可能需要解决潜在的不兼容问题。

Composer使用Composer.json文件来跟踪我们项目的显式依赖关系,作为语义版本范围。例如,您的项目可能需要drupal/core:>=9.4,这告诉Composer安装drupal-core 9.4或更高版本。项目使用的每个模块和主题在composer.json中都有相应的行。

我们项目的每个依赖项都有自己的依赖项。例如,Drupal Commerce模块需要Address模块以及用于货币格式化的非Drupal PHP库。当我们下载商务模块时,Composer还将下载地址模块和货币格式化库。

当Composer递归解析这些依赖关系时,它会构建一个完整的项目中使用的第三方依赖关系列表(包括依赖关系的依赖关系)。然后将完全解析的依赖树存储在composer.lock文件中。此文件包含每个依赖关系的元数据,包括下载包的位置、任何PSR-4自动加载信息以及引用依赖关系确切版本的哈希。当其他开发人员和CI管道运行composer install命令时,composer会检查composer.lock文件,并将所有列出的依赖项下载到您的项目中。

二、评估升级兼容性

不兼容可以采取几种不同的形式。在Drupal 10的情况下,有8个模块,一个主题从核心中删除(一些被移动到contrib空间,另一些被删除)。我们还看到各种已弃用的函数完全从核心中删除。如果你的项目依赖于其中任何一个,你需要采取行动来解决不兼容问题。

Drupal社区维护着一个名为“升级状态”的模块,可用于为您提供升级路径的全貌。此模块为您提供了一系列工具,可用于扫描Drupal安装中不推荐使用的模块。它还会扫描您的代码库,查找对已弃用函数的调用,或info.yml和composer.json文件中的不兼容性。

#安装升级状态的最新开发版本

composer require drupal/upgrade_status:4.x-dev --dev

升级状态附带的最强大的工具之一称为“Drupal检查”。Drupal Check使用PHPTan的静态分析来查找对弃用函数的调用。Drupal检查是一个很好的工具,可以帮助以高性能的方式发现代码中的错误,也是您应该内置到CI管道中的工具类型。如果我不调用内置Drupal Check的Acquia BLT,那我就是失职了!

升级状态依赖于Drupal Check。这意味着Composer将在Composer require命令期间自动安装Drupal Check和Upgrade Status。我们还可以通过类似的composer require命令明确地只要求Drupal Check。

# Require Drupal Check explicitly
composer require mglaman/drupal-check
# Run drupal-check
php vendor/bin/drupal-check

运行Drupal Check将输出一个潜在代码问题列表,供您在执行升级之前检查和解决。对弃用代码的任何调用都可以使用Drupal的更改记录来解决。Drupal的代码库通常也会发出PHP通知,其中包含如何解决未来弃用的详细信息。

三、PHP版本升级

Drupal 10至少需要PHP 8.1,这与Drupal 9所需的最低7.4相去甚远。PHP 8为语言结构带来了令人印象深刻的优化和变化。Composer允许我们将PHP版本指定为项目依赖项,就像我们需要其他依赖项一样。这迫使Composer检查我们的包是否与PHP 8兼容。

composer require php:"^8.1"  --no-update

我们还可以要求在主机上运行特定版本的PHP。如果系统上运行的PHP版本尚未升级到适当的版本,这将给开发人员一个提醒。

composer config platform.php 8.1

大多数PHP 7.4代码与8.x兼容,但通过更改通知和上述工具查看向后兼容性总是一个好主意。

四、使用Composer升级Drupal核心

最后,是时候升级Drupal了!使用Composer,我们可以使用Composer require命令显式地要求Drupal 10。这将更新我们的composer.json并添加Drupal 10作为显式依赖项。我们还传递了--no-update标志,以阻止运行完整的依赖关系解析过程。这为我们在开始升级过程之前提供了一个“保存工作”的好地方。

composer require drupal/core:"^10.0" --no-update

这个require命令告诉Composer Drupal核心的最低可接受版本是10.0。用于明确版本要求的包因项目而异。如果你的项目是按照Drupal.org上的说明设置的,那么这个版本要求将出现在Drupal/core推荐的软件包中。通过检查composer.json文件,您可以找到放置版本约束的包。

composer require drupal/core-recommended:"^10.0" --no-update

最后,我们可以通过运行以下命令来升级所有依赖项:

composer update

此命令获取composer.json文件中的信息,并尝试解析依赖树。在执行此操作时,它将分析您项目的所有依赖关系,包括PHP版本,并确定是否有方法满足您的所有依赖。这个过程通常并不简单,你最终可能会遇到冲突。没关系!事实上,这意味着Composer在发现冲突方面做得很好。

冲突输出如下:

- Root composer.json requires drupal/devel ^4.0 -> satisfiable by drupal/devel[4.0.0-rc1, ..., 4.x-dev].
- drupal/core-recommended[10.0.0-alpha4, ..., 10.0.0-alpha5] require symfony/var-dumper v6.0.8 -> satisfiable by symfony/var-dumper[v6.0.8].
- Conclusion: don't install symfony/var-dumper v6.0.8 (conflict analysis result)

在这种情况下,Composer告诉我们,devel在它们的一个相互依赖项symfony/var/dumper上与Drupal核心发生了冲突。访问Devel模块页面后,我们可以看到有一个与Drupal 10兼容的较新版本的Devel。我们可以要求此模块的新版本,然后重新运行更新过程。

composer require drupal/devel:^5.0 --no-update
composer update

这解决了devel模块的版本不兼容问题,我们将继续解决更新过程中出现的其他冲突。解决这些冲突可能需要一些不同的方法。有时它需要使用模块的开发版本,其他时候可能需要向Drupal.org提交自己的补丁。升级状态模块为我们做了很多这方面的工作,但理解和解决Composer冲突是现代Drupal开发中的一项重要技能。

从这里开始,流程是冲洗和重复——运行Composer更新,分析冲突,并用适当的方法解决。

从历史上看,Drupal版本之间的升级充满了需要大量开发和测试的挑战。自从引入Composer和社区工具(如Upgrade Status和Drupal Check)以来,升级几乎变得微不足道。只需一点配置和专业知识,Composer就可以用来升级从PHP版本和contrib模块到
Drupal核心本身的所有内容,同时发现不兼容和潜在问题。

正确理解和使用Composer是成功升级和维护现代Drupal项目的关键。

五、专业的Drupal服务商

自 2008 年起,成都长风云 Drupal开发团队便深耕 Drupal 技术领域,如今已积累 17 年专业开发经验。无论是 Drupal7 升级至 Drupal10/11,还是全新 Drupal系统、企业官网、电商网站开发,亦或是既有 Drupal系统维护,我们都能以扎实技术为您高效落地需求。
合作咨询:手机号 13795726015 / 微信号 changfengqj
 

联系我们

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

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