Composer 2.0 正式推出
Composer 是 PHP 的套件管理工具,我從 1.0 的測試版時就開始使用了,切確時間不清楚,不過可以確定 1.0.0 版是在 2016 年的時候標版的。
過了 4 年,總算出現 2.0 大改版了,來看看到底有什麼改變!
安裝
Mac 可以直接使用 Homebrew 更新:
brew upgrade composer |
我有安裝 hirak/prestissimo 外掛,它可以加快下載速度。但這個外掛跟 Composer 2.0 並不相容,所以只能先移除它:
composer global remove hirak/prestissimo |
最後來確認 Composer 版本:
$ composer --version |
測試下載
官網第一個提到的大改變就是下載套件的效能提升。
Source: Composer 2.0 is now available!
這裡以 Laravel v8.2.0 做為測試的樣本,分作三次測試:
- 有 cache + 有 composer.lock
- 沒有 cache + 有 composer.lock
- 沒有 cache + 沒有 composer.lock
時間應該是 1 < 2 < 3,不過就大概看一下結果:
清快取使用
composer clear-cache
指令。
# 有 cache + 有 composer.lock |
下載就 log 看起來應該是平行下載,也就是 Composer 2.0 已內建類似 hirak/prestissimo 外掛所提供的功能了。而 Updating dependencies 階段,在過去 Composer 1.x 我都覺得非常久,現在試了幾個專案下 composer update
有感到速度變非常快。
下載與更新依賴變快最大的好處,在於新成員或 CI 的下載時間可以大幅縮短,以及提升安裝新套件的速度,這對整個開發流程有很大的幫助。
調整 vendor 目錄與 update 行為
在 Composer 1.x 的時候,vendor 目錄裡面的內容,是會影響 update 行為的。我目前並不是很確定實際的行為,但 update 實際上是看下面幾個檔案的內容在決定是否要更新的:
- composer.json
- composer.lock
- vendor 目錄裡的檔案
過去會有 update 到一半失敗,然後第二次執行會無法下載的可能。在 Composer 2.0 開始,上面的 3 的內容將不會影響 update 行為。
執行階段檢查
composer.json
可以定義 platform,也就是執行機器上的環境。乍看之下,可以確保程式能在正確的環境上執行,似乎非常有用,但實際上 1.x 的檢查是發生在安裝套件的階段。
Composer 2.0 開始,platform 檢查功能將會內建在 vendor/autoload.php
裡。
錯誤回報改善
過去當依賴無法安裝的時候,有可能會跑出一大票訊息,看也看不懂。
Composer 2.0 會精簡這個訊息。
單一套件更新
這個也是很有用的功能,有時候只想更新一個套件,尤其是依賴套件,Composer 1.x 只能使用 composer require
指令
現在可以用下面這個指令更新單一套件:
composer update vendor/package:1.0.* |
總結
感覺似乎很厲害,那我們是不是要來升級成 Composer 2.0 了,答案是:沒有理由不去做,反而是有很多理由支持我們要升級:
- Composer 2.0 一樣支援 PHP 5.3
composer.json
與composer.lock
規格完全一樣- 指令用法幾乎沒變
- 更新指令非常簡單:
composer self-update --2
當然,還是有些東西是不向下相容的:
- 外掛需要等待開發者調整程式,才能支援 Composer 2.0,官網提到這是最容易遇到的問題,確實馬上就遇到了
- 原本沒檢查環境,現在變成要檢查環境,這樣就有可能會導致放上系統時發生錯誤
- Repository 優先序調整
- 不合法的 PSR-0 / PSR-4 設定,將無法正常使用
上面這四點,官網提到是外掛比較嚴重,其他都是有辦法解決的。
最後,雖然 PHP 5.3 能用,但官網預計會在 2.2 版的時候捨棄 PHP 7.1 以下版本了。可以的話,還是趕快升級 PHP 7.2+ 吧!