這次的文章將詳細敘述我在進行版本升級時所採取的步驟,以及在升級過程中遇到的問題。所使用的語言與框架分別為 PHP 和 Laravel。不過,我認為即使是不同的語言或框架,大致上的升級作法應該相去不遠。
步驟一—確認目標版本
假設我們現在要將 PHP 版本從 8.0 升級至 8.2,首先會進行升級至 8.1 的過程,並查詢 Laravel 是否有對應的版本升級。
幸運的是,這次 PHP 的版本升級正好可以與框架升級同步進行,將 Laravel 從 9.0 升級至 10.0。步驟二—查詢官方文件
需要參考的主要文件包括 PHP 官方文件 和 Laravel 官方文件,以及針對版本的相關 issue。從 PHP 文件來看,並沒有棄用的功能;而 Laravel 則有關於 Composer 和資料庫相關內容的要求與調整,這些部分將會在下一步驟中進行程式碼層面的調整,目前只需記錄下來。
另外,如果是 PHP 5.4 以上的版本,也可以使用 PHPCompatibility 這個套件。下載後執行以下指令:
/.config/composer/vendor/bin/phpcs -n -p . --standard=PHPCompatibility --runtime-set testVersion 8.1 --report-full=./mylog.log --extensions=php --ignore="vendor"
此指令會初步檢查程式碼是否有需要調整的地方。
步驟三—確認套件
接下來,我們需要確認 composer.json
中的套件是否需要升級,或著是否需要替換為其他套件。原則上,應該逐一確認每個套件。除了進入套件的 Git 頁面查看版本相容資訊外,也可以利用 Can I upgrade Laravel yet? 或 laravelshift 來進行檢查。
當然,如果有前人留下的 changelog,那就再好不過了。
步驟四—更新版本
調整 composer.json
根據前一步驟獲得的版本列表,我們首先手動調整 composer.json
中的套件至所需版本,並將棄用的套件刪除。
接著執行套件更新的指令:composer update <異動的套件名稱> -W --ignore-platform-reqs
其中,-W
或 --with-all-dependencies
會更新指定的套件及其所有相關依賴套件,--ignore-platform-reqs
則會忽略平台要求,包括 PHP 版本和 PHP 擴展。
對了,這個指令也會更新 composer.lock
,因此可以根據檔案異動驗證更新的套件是否正確。
調整程式碼
由於套件的更新與棄用,程式碼本身也需要做相應調整。在更新套件後,調整程式碼的同時也能檢查是否會引發錯誤。
調整完成後,可以執行檢測高敏感性套件的指令:composer diagnose
此指令可以幫助檢查是否有其他需要調整的套件。
調整容器設定
除了之前調整過的 composer.json
中的 PHP 版本外,不要忘記容器中的 PHP 版本與框架版本也需要同步調整!
啟動容器並再次調整
設定完成後,我們可以啟動容器來確認其是否能正常運行。不過,這時如果啟動失敗也是正常的情況,我們可以根據 log 訊息再次調整套件與程式碼。
舉例來說,我曾在這個步驟回頭調整資料庫關聯與 Redis 設定,或者在啟動時發現 PHP 的依賴項需要調整,這時可能需要在 buildspec.yml
中新增相應的依賴(指令:apt-get install -y --no-install-recommends php8.2-soap
)。
整體過程是:啟動容器 → 自動化測試 → 手動測試 → 調整程式碼與套件。經過幾輪反覆調整與測試,當所有測試都通過後,就代表升級工作完成了!
其他問題
更新不在 composer.json
中的套件
在使用指令檢查套件版本時,有時會發現某些依賴套件出現在 composer.lock
中,但並未列於 composer.json
。
首先,我們需要執行以下指令來確認該套件是由哪個套件依賴的:composer why <套件名稱>
如果確認該依賴套件符合原本套件的版本,但不符合 PHP 版本要求,我們可以考慮將該依賴套件加入 composer.json
進行版控。
這次的升版介紹就到這裡,希望看完後,大家能夠掌握如何進行版本升級的流程!