如何通过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 10 升级

 

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 都有哪些坑要踩?

 

  1. 升级所有第三方模块和主题到最新版
  2. 运行drupal-check 或者 Upgrade Status 获取所有被废弃的模块。
  3. 检查被废弃的模块,看看drupal官网有没有替代办法或者更新计划。
  4. 应用所有官网的补丁
  5. 再次运行drupal-check 或者 Upgrade Status 看看还有哪些模块是废弃掉的。
  6. 被废弃的模块,没有替代办法,就只能手动修复或者放弃该模块。

我们看看Drupal被废弃的API和函数统计,如下:

大约有 33,000 处被废弃和更新,那么如果是一个深度的项目,这个修改成本就会很高。

 

 

PHP Rector

 

什么是Rector, 他是一个类似于只能PHP转换工具,可以自动升级 PHP,并且可以理解PHP的内容,然后代码成其他更兼容的格式。

所以,听起来个很高级的工具!

 

Rector的原理

  1. 分析PHP代码成为一个抽象语法树 (AST)
  2. 运行一些PHP的升级规则
  3. 保存所有的修改到文件

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的最新版本上有所体现,所以升级新版本也能带来更多新特性的尝试。

 

更多资料,请参考我们之前的文章:

1. Drupal 10 初探及常见问题答疑

2. Drupal 7/8/9 如何升级到Drupal 10?

3. Headless CMS:以API为输出的内容系统的构建

4. 开源的CMS如何实现问卷调研?

5. 基于Drupal的在线教育网站案例