如何通过Drupal Rector来快速升级Drupal
Drupal升级的成本为什么高?由于历史原因,Drupal 7和以前的版本,都是基于函数化变成的,所以有很多Hook,类似比较老的C语言,当然里面也有一些自定义的OOP的结构,但是总体来说比较老旧。
自从Drupal 8之后,Drupal就基于比较强档的Symfony来开发,Symfony本身是OOP、IoC、SOP类型的开发,所以整个Drupal就做了较大的升级和改进。
这样就带来了一个负面效应,就是Drupal 7升级Drupal 8难度非常大,甚至基本会导致重新开发。
这个问题一度导致Drupal 8的安装量相比Drupal 7急剧下降,并且也给人留下了一个Drupal很难升级的印象。所以后来Dries就承诺,Drupal 升级永远不会再困难 (Making Drupal upgrades easy forever)。
本文就介绍一下Drupal 8后面的升级情况,以及使用Rector提高升级的效率做一个简单介绍。
Drupal升级的规律和版本间的差异
Drupal 8 版本后,Drupal 分三个类型的版本,
1. 子版本,比如 8.1.1, 8.1.2,8.1.3等,这种子版本基本就是对当前小版本的bugfix之类,一般可以直接升级,不会有太大问题。
2. 小版本,比如8.1,8.2,8.3,这种小版本一般是6个月发布一次,功能包括 bug fixes, 新feature, API改进,还有废弃某一部分API。
3. 大版本,比如8,9,10这种大版本,这种大版本的发布主要是核心主动升级,比如Symfony升级、或者其他比如数据库、技术迭代比如7到8等而导致的,此外也会有新feature,API改进等。
大版本和小版本的区别
大版本也包括了小版本的内容,但是大版本还会做两件事,
1. 升级核心组件和依赖,比如Symfony更新
2. 删除被标记deprecated的API
如果一个系统没有使用deprecated api的话,升级大版本和小版本几乎差不多。
可以查看下图分析,来看Drupal核心和API之间的关系,
Drupal 8 到 Drupal 9 的步骤
我们来看一下 Drupal 8 升级到 Drupal 9 都有哪些坑要踩?
- 升级所有第三方模块和主题到最新版
- 运行drupal-check 或者 Upgrade Status 获取所有被废弃的模块。
- 检查被废弃的模块,看看drupal官网有没有替代办法或者更新计划。
- 应用所有官网的补丁
- 再次运行drupal-check 或者 Upgrade Status 看看还有哪些模块是废弃掉的。
- 被废弃的模块,没有替代办法,就只能手动修复或者放弃该模块。
我们看看Drupal被废弃的API和函数统计,如下:
大约有 33,000 处被废弃和更新,那么如果是一个深度的项目,这个修改成本就会很高。
PHP Rector
什么是Rector, 他是一个类似于只能PHP转换工具,可以自动升级 PHP,并且可以理解PHP的内容,然后代码成其他更兼容的格式。
所以,听起来个很高级的工具!
Rector的原理
- 分析PHP代码成为一个抽象语法树 (AST)
- 运行一些PHP的升级规则
- 保存所有的修改到文件
Rector目前能做的
- 修改 classes, methods, properties, namespaces or constants
- 升级代码 从PHP 5.3 to PHP 7.4
- 升级代码从 Symfony 3 to Symfony 4
Drupal Rector 模块
Drupal也有了Rector的模块,具体可以访问
https://github.com/palantirnet/drupal-rector
https://drupal.org/project/rector.
也可以直接通过composer来安装,composer require palantirnet/drupal-rector --dev
安装完成之后,就可以运行rector来自动升级相关的模块,以便适配Drupal 9的核心代码,可以参考下面的示例
最后,还是推荐尽快升级到Drupal的最新版本,Drupal的一些新功能,新模块,都是在Drupal的最新版本上有所体现,所以升级新版本也能带来更多新特性的尝试。
更多资料,请参考我们之前的文章:
2. Drupal 7/8/9 如何升级到Drupal 10?
3. Headless CMS:以API为输出的内容系统的构建