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
Composer version 2.0.0 2020-10-24 11:16:19

測試下載

官網第一個提到的大改變就是下載套件的效能提升。

Source: Composer 2.0 is now available!

這裡以 Laravel v8.2.0 做為測試的樣本,分作三次測試:

  1. 有 cache + 有 composer.lock
  2. 沒有 cache + 有 composer.lock
  3. 沒有 cache + 沒有 composer.lock

時間應該是 1 < 2 < 3,不過就大概看一下結果:

清快取使用 composer clear-cache 指令。

# 有 cache + 有 composer.lock
$ time composer install -q

________________________________________________________
Executed in 7.29 secs fish external
usr time 2.91 secs 106.00 micros 2.91 secs
sys time 5.64 secs 604.00 micros 5.64 secs


# 沒有 cache + 有 composer.lock
$ time composer install -q

________________________________________________________
Executed in 21.01 secs fish external
usr time 3.97 secs 123.00 micros 3.97 secs
sys time 6.27 secs 750.00 micros 6.27 secs


# 沒有 cache + 沒有 composer.lock
$ time composer install -q

________________________________________________________
Executed in 24.77 secs fish external
usr time 5.74 secs 125.00 micros 5.74 secs
sys time 6.79 secs 678.00 micros 6.79 secs

下載就 log 看起來應該是平行下載,也就是 Composer 2.0 已內建類似 hirak/prestissimo 外掛所提供的功能了。而 Updating dependencies 階段,在過去 Composer 1.x 我都覺得非常久,現在試了幾個專案下 composer update 有感到速度變非常快。

下載與更新依賴變快最大的好處,在於新成員或 CI 的下載時間可以大幅縮短,以及提升安裝新套件的速度,這對整個開發流程有很大的幫助。

調整 vendor 目錄與 update 行為

在 Composer 1.x 的時候,vendor 目錄裡面的內容,是會影響 update 行為的。我目前並不是很確定實際的行為,但 update 實際上是看下面幾個檔案的內容在決定是否要更新的:

  1. composer.json
  2. composer.lock
  3. 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 了,答案是:沒有理由不去做,反而是有很多理由支持我們要升級:

  1. Composer 2.0 一樣支援 PHP 5.3
  2. composer.jsoncomposer.lock 規格完全一樣
  3. 指令用法幾乎沒變
  4. 更新指令非常簡單:composer self-update --2

當然,還是有些東西是不向下相容的:

  1. 外掛需要等待開發者調整程式,才能支援 Composer 2.0,官網提到這是最容易遇到的問題,確實馬上就遇到了
  2. 原本沒檢查環境,現在變成要檢查環境,這樣就有可能會導致放上系統時發生錯誤
  3. Repository 優先序調整
  4. 不合法的 PSR-0 / PSR-4 設定,將無法正常使用

上面這四點,官網提到是外掛比較嚴重,其他都是有辦法解決的。

最後,雖然 PHP 5.3 能用,但官網預計會在 2.2 版的時候捨棄 PHP 7.1 以下版本了。可以的話,還是趕快升級 PHP 7.2+ 吧!

參考資料