Composer 基本使用

基本用法

引言

介紹基本用法,我們將安裝 monolog/monolog 日誌庫作爲範例。如果你還沒有安裝 Composer,請參閱 Composer 安裝 章節。

注意:爲簡便起見,我們假定你已經 本地 安裝了 Composer。

composer.json:項目設置

若要在項目中使用 Composer 你需要一個 composer.json 文件。該文件描述了你的項目依賴關係和其他元數據。

require 鍵

首先(通常也是唯一)應該做的事情就是在你的 composer.json 文件中定義好 require 鍵。你應該簡要告訴 Composer 你的項目所依賴的包有哪些。

{
    "require": {
        "monolog/monolog": "1.0.*"
    }
}

如上所示, require 獲取了一個包名稱 (例如 monolog/monolog)映射到版本約束 (例如 1.0.*)的 json 對象。

Composer 使用該信息去「版本庫」中搜索,你在 Composer.json 中註冊的 repositories 鍵所指定的版本倉庫中的相關合適的文件,或是在 Packagist 中默認的包庫。在上述示例中,因爲沒有其他在 composer.json 文件中註冊的版本庫信息,所以它認爲 monolog/monolog 包默認是在 Packagist 中。(更多 Packagist 信息請參閱如下,或在此閱讀更多相關信息。

包名稱

包名由供應商名稱和項目名稱組成。通常情況下,這些名稱是相同的,供應商名稱的存在則很好的解決了命名衝突。 例如,它允許兩個不同的人創建同樣名爲 Json 的庫。 可以命名爲 igorw/json 和 seldaek/json。

在這裏您可以閱讀更多有關發佈包和包命名的內容。

注意,您還可以指定 “平臺包” 作爲依賴項,這允許您自定義某些版本的服務器軟件。請參閱下面的平臺軟件包

包版本約束

在上面的示例中,我們引入的 monolog 版本指定爲 1.0.*。這表示任何從 1.0 開始的開發分支,它將會匹配 大於或等於 1.0 且小於 1.1 的版本。

請閱讀關於版本的更深入信息,如何相互關聯或如何版本控制。

Composer 如何下載正確的文件?當您在 composer.json 中指定一個依賴項時, Composer 首先獲取您所請求的包的名稱,並在已使用庫密鑰註冊的任何存儲庫中搜索它。如果您沒有註冊任何額外的存儲庫,或者它在您指定的存儲庫中找不到具有該名稱的包,則返回到 Packagist (下面是詳細說明)。

當 Composer 在打包器中找到正確的包時,或者在已指定的包的儲存庫,它使用包的 VCS (即分支和標籤)的版本化特性來嘗試找到您指定的版本約束的最佳匹配。請務必閱讀有關版本和包聲明的文章。

注意:如果您試圖獲取一個包,但 Composer 拋出關於包穩定性的錯誤,則您指定的版本可能無法滿足默認的最小穩定性要求。默認情況下,只有在搜索 VCS 中的有效包版本時纔會考慮穩定的版本。

如果你也想獲得 DEV、Alpha、Beta 或 RC 版本。請閱讀更多關於穩定標誌和 minimum-stability key on the schema page。

安裝依賴關係

使用 install命令爲你的項目安裝已經定義好的依賴關係

php composer.phar install

運行該命令,composer 會根據情況通過以下兩種方式中的一種進行安裝

非 composer.lock 安裝

如果你之前從未運行過命令就不會出現 composer.lock 文件,Composer 只會解析你在 composer.json 文件中列出的依賴關係並且下載最近版本到你項目 vendor 目錄中 ( vendor 是項目中存放所有第三方代碼的常規目錄)。在我們上面的例子中,你最終會在 vendor/monolog/monolog/ 目錄中看到所有 Monolog 的源文件。如果 Monolog 有任何依賴,也將會出現在 vendor/ 中.

提示:如果你的項目中使用了 git, 或許你希望將 vendor 添加到 .gitignore 中。因爲將所有第三方包添加到版本庫裏面看起來很傻。

當 Composer 完成安裝後,它將把所有下載的包和確切的版本信息寫入到 composer.lock 文件,以此來鎖定項目中第三方包的版本。你應該將 composer.lock 放在項目倉庫中,以便該項目所有成員都能鎖定在依賴關係相同的版本

使用 composer.lock 文件安裝

這裏來到了第二種安裝方式。如果你在運行 composer install 命令之前已經存在了 composer.lock 和 composer.json 文件, 這意味着你之前使用了 install 命令, 或者項目中的其他成員使用了 install 命令並將 composer.lock 文件提交至了項目中 (這是非常好的)。

無論使用哪種方式,存在 composer.lock 文件時使用 install 命令安裝依賴時 composer.lock 都會解析並安裝你在 composer.json 中所列出來的依賴,但是 Composer 會嚴格使用 composer.lock 文件列出來的版本來確保項目中的所有成員所安裝的版本都是一致的。因此,你可以獲得 composer.json 文件列出的所有文件,但是與此同時他們可能並不是最新的可用版本 (一些在 composer.lock 文件中列出的依賴可能會在這個文件創建之後釋放了新的版本)。這個是設計上的,這樣的設計可以確保你的項目不會因爲一些依賴的改變而崩潰。

提交你的 composer.lock 文件至版本控制工具

將此文件提交至 VC 是非常重要的。因爲它可以確保項目中的任何人使用的都是與你是完全一致的依賴。 你的 CI 服務器,生產服務器,團隊的其他開發人員,所有人都使用的是相同的依賴項,這減輕了僅部署某些部分而引起錯誤的可能性。即使你獨立開發,在你重新安裝項目的 6 個月內,你的依賴項發佈了許多新的版本,你依然可以確信你的依賴項是可用的。(請參閱下邊有關使用 update 的命令。)

更新依賴到最新版本

如上所述,composer.lock 文件將阻止你自動獲取最新依賴版本。如果要更新依賴到最新版本,使用 update 命令。這將獲取最新匹配的版本(根據你的 composer.json 文件)並將新版本更新到 composer.lock 文件。(這相當於刪除 composer.lock 文件並再次運行 install)。

php composer.phar update

注意:當執行 install 命令時,由於 composer.json 的更改可能影響到依賴解析而未更新 composer.lock ,Composer 將顯示警告。

如果只是想安裝或更新一個依賴,可以將它們列出來:

php composer.phar update monolog/monolog [...]
注意:對於庫來說,沒必要提交 composer.lock 文件,請參考:庫 - 鎖文件。

Packagist

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- 允許你依賴 PHP 擴展(包括核心擴展)。通常 PHP 拓展的版本可以是不一致的,將它們的版本約束爲 * 是一個不錯的主意。一個 PHP 擴展包的例子是:ext-gd。

lib- 允許對 PHP 庫的版本進行限制。以下可用例子: curl, iconv, icu,libxml,openssl, pcre, uuid, xsl。

你可以使用命令 show --platform 去獲取你本地可用的平臺包。

自動加載

爲了描述包的自動加載信息, Composer 會生成一個 vendor/autoload.php 文件,你可以簡單的 include 這個文件,並在無需其它額外工作的情況下就可以使用這些包所提供的類:

require __DIR__ . '/vendor/autoload.php';

$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');

你甚至可以在 composer.json 中添加一個 autoload 指令,來添加自己的自動加載聲明

{
    "autoload": {
        "psr-4": {"Acme\\": "src/"}
    }
}

Composer 會爲 Acme 命名空間註冊一個 PSR-4 的自動加載.

你定義一個命名空間指向目錄的映射。 在 vendor 目錄同級的 src 目錄將成爲你項目的根目錄。一個案例,文件名 src/Foo.php 需包含 AcmeFoo 類。

添加 autoload 指令之後,你必需重新運行 dump-autoload 來重新生成 vendor/autoload.php 文件。

包含此文件後也可以接收到一個 autoloader 實例,由因此您可以將 include 調用的返回值存儲在變量中並添加更多名稱空間,這在測試套件中將會很有用,例如:

$loader = require DIR . '/vendor/autoload.php';
$loader->addPsr4('Acme\Test\', __DIR__);
作爲 PSR-4 自動加載規範的補充,Composer 也支持 PSR-0、類表、文件清單的自動加載方式。具體請查詢 autoload 引用。

你也可以查閱 optimizing the autoloader 瞭解關於自動加載器的優化.

注意:Composer 提供自己的加載器,但如果你不想使用那個而想自己配置加載器的話,你可以試試 include vendor/composer/autoload_*.php 這些文件所返回的關聯數組來實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章