跳转到主要内容

概述

drupal 8到9并不是一个跨越式的版本升级,主要是对Symfony的版本更新,升级比较平滑。当然也deprecate了一些drupal 8的函数,特别是自定义模块或者主题需要注意,本文介绍如何通过Composer来升级drupal 8到 drupal 9。这里主要针对drupal 8.8+之后的composer构建项目。

基础准备

1.一定要先备份好升级前的网站代码和数据库,非常重要!!!

2.drupal 9对php版本的要求是php7.2+,当前最新版本是7.4,稳妥的选择就是7.3+

3.确保网站升级到最近的minor版本,比如当前的8.9+,而不是从8.2或者8.5版直接升级

4.确保网站中没有被deprecated的代码,这个可以通过模块Upgrade Status模块来检查,这个不确保,网站升级完可能就崩了

5.drupal 8.8开始引入了一种更加方便使用composer管理的机制,项目的构建不同于以前版本的drupal/core,而是drupal/recommended-project或者drupal/legacy-project,项目的构建方式决定了能否通过Composer进行版本升级,新建项目可以参考使用Composer安装维护drupal 8.

升级基于composer构建的drupal8.8+网站:

1.修改相关目录权限,以便composer对文件的更新

chmod 777 web/sites/default
find web/sites/default -name "*settings.php" -exec chmod 777 {} \;
find web/sites/default -name "*services.yml" -exec chmod 777 {} \;

2.需要将core-recommended和dev依赖都require下来,避免依赖问题

composer require drupal/core-recommended:^9.0.0 drupal/core-composer-scaffold:^9.0.0 drupal/core-project-message:^9.0.0 --update-with-dependencies --no-update

composer require drupal/core-dev:^9.0.0 --dev --update-with-dependencies --no-update

composer update

drush updatedb

drush cr

3.升级完成,还原相关目录和文件的权限

chmod 755 web/sites/default
find web/sites/default -name "*settings.php" -exec chmod 644 {} \;
find web/sites/default -name "*services.yml" -exec chmod 644 {} \;

错误处理:

通过Upgrade Status模块检测并修改过的代码,通常是可以正常升级的。如果网站在8.8+的时候可以正常运行,升级后还是崩了,那就根据后台或者watchdog日志看看错误原因,然后修改。这里举一个简单的Deprecated问题的例子:

Error:Call to undefined method Drupal\node\Entity\Node::URL()   #在模块或者THEMENAME.theme文件中

当日志报这个错误的时候,查询9.0版本的API文档发现Node的URL()已经不存在了,查看8.0文档的时候,这个方法也被标记说明在9.0之后deprecated,且建议使用toUrl()方法替代。找到代码相应位置替换,这个错误就消除了。

注意,到了9.1之后版本后,core开始支持composer 2,不再支持composer 1了,升级core需要先升级到composer 2,注意备份并删除composer.lock,升级过程中,如果提示plugins-api相关错误,则在composer.json中删除相关的依赖,再进行升级即可。

参考:

https://www.drupal.org/docs/upgrading-drupal/upgrading-from-drupal-8-to-drupal-9-or-higher
分类