概述
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