對於咱們的基本用法介紹,咱們將安裝monolog/monolog一個日誌庫。php
注意:爲簡單起見,本簡介假設你已執行composer的本地安裝。
要在項目中開始使用composer,您只須要一個composer.json文件。此文件描述了項目的依賴關係,也可能包含其餘元數據。git
您指定的第一個(一般也是惟一的)composer.json是require密鑰。您只是告訴composer您的項目所依賴的包。json
{ "require": { "monolog/monolog": "1.0.*" } }
如您所見,require採用將包名稱(例如monolog/monolog)映射到版本約束(1.0.*)的對象。數組
composer使用此信息在您使用repositories祕鑰註冊的軟件包「存儲庫」中搜索 正確的文件集,或者在默認軟件包存儲庫Packagist中搜索。在上面的示例中,因爲沒有在composer.json文件中註冊其餘存儲庫,所以假定monolog/monolog包已在Packagist上註冊。(請在下面查看有關Packagist的更多信息,或者在此處閱讀有關存儲庫的更多信息)。服務器
包名由供應商名稱和項目名稱組成。一般這些都是相同的-供應商名稱僅用於防止命名衝突。例如,它容許兩個不一樣的人建立一個名爲的庫json。一個可能被命名igorw/json而另外一個被命名爲seldaek/json。架構
閱讀有關在此處發佈包和包命名的更多信息。(請注意,您還能夠將「平臺軟件包」指定爲依賴項,容許您須要某些版本的服務器軟件。請參閱下面的平臺軟件包。)app
在咱們的示例中,咱們使用版本約束請求包monolog包1.0.*。這意味着1.0開發分支中的任何版本,或者任何大於或者等於1.0且小於1.1(>=1.0 <1.1)的版本。composer
請閱讀版本以獲取有關版本的更深刻信息,版本之間的相互關係以及版本限制。curl
composer如何下載正確的文件?在指定依賴時composer.json,composer首先獲取您請求的包名稱,並在使用該repositories鍵註冊的任何存儲庫中搜索它。若是您還沒有註冊任何額外的存儲庫,或者在您指定的存儲庫中找不到具備該名稱的軟件包,則會退出Packagist(更多信息以下)。測試
當composer在Packagist或者您指定的repo中找到正確的包時,它會使用包的vcs的版本控制功能(即分支和標記)來嘗試找到您指定的版本約束的最佳匹配。請務必閱讀版本文章中的版本和程序解析。
注意:若是您嘗試要求程序包但composer會引起有關程序包穩定性的錯誤,則您指定的版本可能不符合默認的最低穩定性要求。默認狀況下,在vcs中搜索有效的軟件包版本時,僅考慮穩定版本。
若是您嘗試要求包的dev,alpha,beta或者rc版本,則可能會遇到此問題。閱讀有關穩定性標誌和架構頁面minimum-stability上的鍵的更多信息。
要爲項目安裝已定義的依賴項,請運行該install命令。
php composer.phar install
運行此命令時,可能會發生如下兩種狀況之一:
若是您以前從未運行過該命令而且也沒有composer.lock文件存在,則composer指揮解析composer.josn文件中列出的全部依賴項,並將其最新版本的文件下載到vendor項目的目錄中。(該vendor目錄是項目中全部第三方代碼的常規位置)。在上面的示例中,您將最終得到monolog源文件vendor/monolog/monolog/。若是monolog列出了任何依賴項,那麼它們也會下下面的文件夾中vendor/。
提示:若是您使用的git爲您的項目,你可能要添加vendor在你的.gitignore。您真的不想將全部第三方代碼添加版本化的存儲庫中。
當composer完成安裝後,它會將全部軟件包及其下載的確切版本寫入composer.lock文件,將項目鎖定到這些特定版本。您應該將composer.lock文件提交到項目倉庫,以便全部在項目上工做的人都被鎖定到相同版本的依賴項(下面更多)。
這將咱們帶到第二種狀況。若是在運行時已存在composer.lock文件和composer.json文件composer install,則表示您install以前運行該命令,或者項目中其餘人運行該install命令並將該composer.lock文件提交到項目(這很好)。
不管哪一種方式,install當composer.lock文件存在時運行會解析並安裝您列出的全部依賴項composer.json,但composer會使用列出的確切版本composer.lock來確保程序包版本對於處理項目的每一個人都是一致的。所以,您將擁有composer.json文件請求的全部依賴項,但它們可能並不是都是最新的可用版本。這是設計的,它確保您的項目不會由於依賴項的意外更改而中斷。
將此文件提交給VC很是重要,由於它會致使設置項目的任何人使用您正在使用的徹底相同的依賴項版本。您的CI服務器,生產計算機,團隊開發中其餘的開發人員,全部的人和每一個人都運行相同的依賴關係,從而減小了僅影響部署的某些部分的錯誤的可能性。即便您單獨開發,在從新安裝項目的六個月內,即便您的依賴項從那時起發佈了許多新版本,您任然能夠確信所安裝的依賴項任然有效。(請參閱下面有關使用update命令的說明。)
如上所述,該composer.lock文件阻止您自動獲取最新版本的依賴項。要更新到最新版本,請使用該update命令。這將獲取最新的匹配版本(根據您的composer.json文件)並使用新版本更新鎖定文件。(這至關於刪除composer.lock文件並install再次運行。)
php composer.phar update
注意:install若是composer.lock因爲對composer.json可能影響依賴項解析的更改而未更新,則composer將在執行命令時顯示警告。
若是您只想安裝或者更新一個依賴項,能夠將它們列入白名單:
php composer.phar update monolog/monolog
注意:對於庫,沒必要提交鎖定文件。
Packagist是composer的主要存儲庫。composer存儲庫基本上是一個包源:一個能夠從中獲取包的地方。Packagist意在成爲每一個人都使用的中央存儲庫。這意味着您能夠自動使用require任何可用的包,而無需進一步指定composer應查找包的位置。
若是您訪問Packagist網站(packagist.org),您能夠瀏覽並搜索包。
建議使用composer的任何開源項目在Packagist上發佈它們的包。庫不須要在Packagist上供composer使用,但它能夠更快地發現和採用其餘開發人員。
composer具備平臺包,這些包是安裝在系統上但實際上不能由composer安裝的虛擬包。這包括PHP自己,PHP擴展和一些系統庫。
- php表示用戶的PHP版本,容許您應用約束,例如^7.1.要求64位版本的PHP,您能夠要求php-64bit包。 - hhvm表示hhvm運行時的版本,並容許您應用約束,例如^2.3. - ext-<name>容許您須要PHP擴展(包括核心擴展)。版本控制在這裏可能很是不一致,所以將約束設置爲一般是個好主意*。擴展包名稱的示例是ext-gd。 - lib-<name>容許對PHP使用的庫版本進行約束。如下是可供選擇:curl,iconv,icu,libxml,openssl,pcre,uuid,xsl。
您可使用show --platform獲取本地可用平臺包的列表。
自動加載
對於指定自動加載信息的庫,composer會生成一個vendor/autoload.php文件。您能夠簡單地包含此文件並開始使用這些庫提供的類,而無需任何額外的工做:
require DIR . '/vendor/autoload.php';
$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\SreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');
您甚至能夠經過添加autoload字段將本身的代碼添加到自動裝帶器中composer.json。
{
"autoload": {
"psr-4": {
"Acme\": "src/"
}
}
}
composer將爲命名空間註冊PSR-4自動加載器Acme。
您能夠定義從名稱空間到目錄的映射。該src目錄將位於項目根目錄中,與vendor目錄位於同一級別。示例文件名將src/Foo.php包含一個Acme\Foo類。
添加autoload字段後,必須從新運行dump-autoload才能從新生成vendor/autoload.php文件。
包含該文件也將返回自動加載器示例,所以您能夠將include條用的返回值存儲在變量中並添加更多名稱空間。例如,這對於在測試套件中自動加載類很是有用。
$loader = require DIR . '/vendor/autoload.php';
$loader->addPsr4('Acme\Test\', DIR);
除了psr-4自動加載外,composer還支持psr-0,類映射和文件自動加載。有關autoload更多信息,請參閱參考。
另請參閱有關優化自動裝載器的文檔。
注意:composer提供本身的自動加載器。若是您不想使用該vendor/composer/autoload_*.php文件,則能夠包含文件,這些文件關聯數組容許您配置本身的自動加載器。