轉載請註明文章出處:https://tlanyan.me/php-review…
PHP回顧系列目錄
Composer是PHP社群推薦的依賴管理工具。Composer之於PHP猶如npm之於Node,幾乎是做現代化PHP開發的必備技能。本文簡要回顧相關概念和Composer用法。
擴充和包
與之相關的概念是框架和庫,關於框架和庫的區別,可以檢視本人之前寫的這篇文章
擴充和包是兩個非常相近的概念。在PHP世界裡,一般可以這樣理解和區分兩者:擴充(extension)和模組(module)等價,是用C語言寫的功能合集;包(package)和庫(library)等價,主要是用PHP實現的功能合集;擴充以動態連結庫(dll或so)的形式載入,包則是通過require/include方式載入。絕大部分時候,兩者混用不會造成理解上的困難。
常見的擴充包括GD、ZIP、XML、MySQLi、OPCache等,常見的包包括PHPMailer、PHPOffice、HTMLPurifier等。
PEAR和PECL
在Composer流行之前,PEAR和PECL是更為PHP開發者所知的兩個工具(社群)。PEAR是PHP擴充和應用倉庫(PHP Extension and Application Repository)的縮寫,官網http://pear.php.net ;PECL是PHP擴充社群庫(PHP Extension Community Library)的縮寫,官網http://pecl.php.net。
兩者的區別可用擴充和包來區分:PECL託管擴充,原始碼多為C檔案,例如APC、AMPQ等;PEAR託管包,功能用PHP實現,如PHP CodeSniffer、HTTP Request等;PEAR對應pear命令,PECL對應pecl命令,可用這兩個命令安裝和管理擴充和包(pear的build/pickle
子命令也可以編譯PECL中的擴充)。兩者互為補充,官網以姐妹(sisters)形容兩者的關係。
PECL是官方擴充的補充,目前仍處於活躍狀態,一些優秀的擴充有成為官方擴充的潛質。韓天峰大神的swoole擴充也託管在PECL中,國內名氣非常高。相比之下PEAR已是明日黃花。PEAR2和Pyrus(下一代的PEAR包安裝工具,基於PHP5.3+構建,官網http://pear2.php.net)的出現也未能挽救PEAR。PEAR沒落伴隨著本文主角Composer的興起。
PEAR的定位是“提供可複用的PHP元件”,以中心化的方式為開發者提供功能包。中心化釋出的方式保證了程式碼的質量,同時帶來維護上的不便:通過評審的包才能釋出,包過時現象嚴重。PEAR安裝的包是全域性的,不能為單獨專案安裝依賴包,非特權使用者不能自行安裝依賴包。其他缺點還包括糟糕的依賴管理。隨著Github的流行和Composer的出現,包管理進入Composer時代。PEAR已經完成其歷史使命,可以安心的去了。
Composer
嚴格來說,Composer的定位是依賴管理工具而非包管理器。Composer中文網對Composer工作介紹如下:
Composer 將這樣為你解決問題:
a) 你有一個專案依賴於若干個庫。
b) 其中一些庫依賴於其他庫。
c) 你宣告你所依賴的東西。
d) Composer 會找出哪個版本的包需要安裝,並安裝它們(將它們下載到你的專案中)。
PEAR能做的事情,Composer都能做(包括安裝PECL擴充),部分還能做得更好。Composer預設把包安裝在專案目錄下,普通使用者就能正常使用(Composer官方建議不要以root身份執行composer命令);鼓勵遵循最佳實踐(即大名鼎鼎的PSR規範,詳情見PHP-FIG官網https://www.php-fig.org),極大的推動PHP社群編碼風格的規範化;Composer是去中心化的平臺,任何人均可釋出程式碼包;釋出包無需評審,包的質量由使用者投票決定…作為PEAR的繼任者,Composer的表現經受住了社群的考驗,併成為事實上的依賴管理標準工具。
Composer目前已經形成龐大的生態,在數量上,Composer的包遠超PEAR。由於任何人均可自由釋出包且無需評審,Composer生態中的包可能存在程式碼質量參差不齊、程式碼風格各異、後門漏洞等隱憂。另外Composer的依賴管理以專案為單位,一臺機器上可能多次安裝同一個包。但瑕不掩瑜,總體而言,Composer極大的改變了PHP的開發生態,促進了程式碼交流和社群發展。
Composer用法
Composer為管理的專案的依賴而生,專案中的composer.json檔案是其工作的依據。該檔案中最重要的部分是require部分,該部分告訴Composer期望安裝的包及其版本,例如:
{
"name": "tlanyan/foo",
"version": "1.0.0",
....
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": ">=2.0.6",
"yiisoft/yii2-swiftmailer": "*",
"yiisoft/yii2-redis": ">=2.0.0",
"smarty/smarty": "< =3.1.25",
"yiisoft/yii2-smarty": ">=2.0.0",
"phpoffice/phpexcel": ">=1.8.0",
"tecnickcom/tcpdf": "~6.2.0"
},
....
}
然後執行composer install
命令,Composer會自動分析依賴,安裝最合適的包到vendor
目錄下。加-v(-vv, -vvv)選項會列印命令執行過程中的詳細資訊。安裝完畢後,vendor
目錄下會生成autoload.php
檔案。在專案的入口檔案中包含此檔案: require __DIR__ . "/vendor/autoload.php";
,接下來便可在專案的任何地方引用依賴包中的介面和類。
除install
命令,Composer提供了許多其他命令管理依賴。常用的命令場景包括:查詢依賴、引入依賴、安裝依賴、更新依賴。分別對應的命令是:
-
composer search
: 根據關鍵字查詢依賴包,例如查詢本人釋出的包:composer search tlanyan
。該命令等同於上https://packagist.org進行包查詢; -
composer require
: 引入依賴,宣告專案或者全域性(global,使用者名稱全域性,非系統全域性)依賴某個包, 例如宣告需要swiftmailer包:composer require [global] "swiftmailer/swiftmailer:dev-master"
;該命令更新composer.json檔案,並預設立即安裝依賴(–no-update選項可阻止預設安裝);效果等同於編輯composer.json檔案,然後執行install命令; -
composer install
:安裝composer.json宣告的依賴包,最終安裝的依賴包版本可能取決於有無composer.lock檔案; -
composer update
: 更新依賴到最新版本,相當於刪除composer.lock檔案後執行composer install
。
以上四條命令涵蓋使用Composer的大部分場景。以下是幾個常用的輔助命令,與依賴分析相關:
-
composer info
: 檢視安裝的依賴包資訊,與composer show
等價; -
composer dumpautoload
: 加-o選項可匯出優化的載入器; -
composer why(-not)
: 檢視(不)安裝某個包的原因。
總結
從拷貝第三方程式碼到專案中(1994),到PEAR安裝依賴包(1999),再到Composer興起(2012),PHP社群經歷了將近20年的探索。PHP這門古老的語言,也在不斷的發展更新,在web領域一直髮光發熱。Composer作為目前PHP包依賴管理的最佳工具,值得每一位PHP開發人員掌握。