轉載請註明文章出處: https://tlanyan.me/php-review...
Composer是PHP社區推薦的依賴管理工具。Composer之於PHP猶如npm之於Node,幾乎是作現代化PHP開發的必備技能。本文簡要回顧相關概念和Composer用法。php
與之相關的概念是框架和庫,關於框架和庫的區別,能夠查看本人以前寫的這篇文章html
拓展和包是兩個很是相近的概念。在PHP世界裏,通常能夠這樣理解和區分二者:拓展(extension)和模塊(module)等價,是用C語言寫的功能合集;包(package)和庫(library)等價,主要是用PHP實現的功能合集;拓展以動態連接庫(dll或so)的形式加載,包則是經過require/include方式加載。絕大部分時候,二者混用不會形成理解上的困難。web
常見的拓展包括GD、ZIP、XML、MySQLi、OPCache等,常見的包包括PHPMailer、PHPOffice、HTMLPurifier等。redis
在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)形容二者的關係。npm
PECL是官方拓展的補充,目前仍處於活躍狀態,一些優秀的拓展有成爲官方拓展的潛質。韓天峯大神的swoole拓展也託管在PECL中,國內名氣很是高。相比之下PEAR已經是明日黃花。PEAR2和Pyrus(下一代的PEAR包安裝工具,基於PHP5.3+構建,官網http://pear2.php.net)的出現也未能挽救PEAR。PEAR沒落伴隨着本文主角Composer的興起。json
PEAR的定位是「提供可複用的PHP組件」,以中心化的方式爲開發者提供功能包。中心化發佈的方式保證了代碼的質量,同時帶來維護上的不便:經過評審的包才能發佈,包過期現象嚴重。PEAR安裝的包是全局的,不能爲單獨項目安裝依賴包,非特權用戶不能自行安裝依賴包。其餘缺點還包括糟糕的依賴管理。隨着Github的流行和Composer的出現,包管理進入Composer時代。PEAR已經完成其歷史使命,能夠安心的去了。swift
嚴格來講,Composer的定位是依賴管理工具而非包管理器。Composer中文網對Composer工做介紹以下:swoole
Composer 將這樣爲你解決問題:a) 你有一個項目依賴於若干個庫。yii2
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.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開發人員掌握。