如何通過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為輸出的內容系統的構建
4. 開源的CMS如何實現問卷調研✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴?