注意到composer是在最近學習一些github裏面的項目時,發現不少都有composer.json,原來這貨是爲了composer包依賴管理工做而活的。其實它在前幾年就出現了,只是那個時候PHP版本5.3之後的版本都慢慢興起來,也就是命名空間才被引用。那,這貨到底能幹嗎呢?簡單來講就是爲你引入一個別人寫好的功能包,而且爲你作好自動加載,你只須要用php標準命名空間來初始化實例就行。能夠看下中文的翻譯介紹。php
要理解好composer須要瞭解其它一些輔助工具,逐一來介紹下。預裝好php環境,composer工具,這些得必須弄好的吧?java
curl -sS http://getcomposer.org/installer| php -- --install-dir=/usr/local/php/bin cp /usr/local/php/bin/composer.phar /usr/bin/ composer about # 驗證
composer.json聲明瞭包依賴以及聲明元素標籤,關鍵的就是require
python
{ "require": { "php": ">=5.3", "huamanshu/xorm": "dev-master" } }
如你所見,require的對象將會映射包的名稱(huamanshu/xorm)和包的版本是dev-master。那,composer會拿huamanshu/xorm去哪獲得相應的包呢?laravel
依賴包名huamanshu/xorm
會到https://packagist.org去獲取包。若是你是包的開發者,那你須要先註冊一個帳號,github亦如此,再提交你的包名到列表裏去。git
而packagist不是實際源碼存儲的地方,它只是自動同步github的項目https://github.com/meolu/xorm.gitgithub
開發者建立本身的項目,而後在setting裏面配置hooks,填寫packagist提供的name、token就能夠在提交的時候,自動同步到packagist。json
其中項目中composer.json跟上面用來引入包的composer.json不太同樣,主要在autoload
,我範例使用的是PSR-4。composer
{ "name": "huamanshu/xorm", "type": "library", "require": { "php": ">=5.3.0" }, "autoload": { "psr-4": { "xorm\\":"src/xorm" } } }
最新的規範是有5個,簡稱PSR。curl
如今composer裏通常在使用PSR-0、PSR-4,後者是在13年末發佈的,但相對前者簡潔了不少,看個例子。工具
Composer使用PSR-0風格
vendor/ vendor_name/ package_name/ src/ Vendor_Name/ Package_Name/ ClassName.php # Vendor_Name\Package_Name\ClassName tests/ Vendor_Name/ Package_Name/ ClassNameTest.php # Vendor_Name\Package_Name\ClassName
Composer使用PSR-4風格
vendor/ vendor_name/ package_name/ src/ ClassName.php # Vendor_Name\Package_Name\ClassName tests/ ClassNameTest.php # Vendor_Name\Package_Name\ClassNameTest
在開始新建的composer.json初始化下composer install
就會生成如下目錄。
├── composer.json ├── composer.lock ├── test.php └── vendor ├── autoload.php ├── composer │ ├── autoload_classmap.php │ ├── autoload_namespaces.php │ ├── autoload_psr4.php │ ├── autoload_real.php │ ├── ClassLoader.php │ └── installed.json └── huamanshu └── xorm ├── composer.json ├── README.md └── src └── xorm └── Go.php
github項目xorm會加載到vendor下,而且生成自動加載文件autoload.php。這過程有點相似thrift,根據一個.thrift文件gen各類語言的接口。
<?php require __DIR__ . '/vendor/autoload.php'; $go = new xorm\Go(); $go->where(); # class Go's function where
除了packagist包,composer 也有平臺的包,這些包是並非由 comoposer 安裝,它們是安裝在操做系統上的東西,composer 將它們做爲虛擬的包,以方便管理。它們包括:PHP 自己,PHP 的擴展,還有一些系統中的庫。composer show --platform
便可看到。
composer提供這樣一個包依賴管理方式對於PHP這樣一個社區興盛的語言,會相似python、java同樣,有大量開發者提供了功能包,須要一個方便的機制來調用,版本更新切換、層級嵌套神馬的。文件拷貝、代碼複製粘貼的時代早已落伍,或許composer很快能一統江湖。不管是想作統計、日誌、ORM等等,composer倉庫裏找找,幾分鐘後,輪子都已經裝備完畢,就等點火啓動,爽不?