composer的安裝和使用 學習日誌

若是你作爲一個phper,沒有用過composer,那你真的不是一個合格的開發者.那麼就來記錄一下composer的學習日誌

下面分享幾個學習源頭:php

composer中文網站:https://www.phpcomposer.com/html

composer中文文檔地址:https://docs.phpcomposer.com/node

packagist中國全鏡像網站:https://pkg.phpcomposer.com/laravel

1.composer是什麼呢?

Composer 是 PHP5.3.2+以上 的一個依賴管理工具。它容許你聲明項目所依賴的代碼庫,它會在你的項目中爲你安裝他們。Composer 不是一個包管理器。是的,它涉及 "packages" 和 "libraries",但它在每一個項目的基礎上進行管理,在你項目的某個目錄中(例如 vendor)進行安裝。默認狀況下它不會在全局安裝任何東西。所以,這僅僅是一個依賴管理。git

簡單來講,Composer 是一個新的安裝包管理工具,服務於 PHP 生態系統。它實際上包含了兩個部分:ComposerPackagistgithub

Composer

Composer 是由 Jordi Boggiano 和 Nils Aderman 創造的一個命令行工具,它的使命就是幫你爲項目自動安裝所依賴的開發包。Composer 中的不少理念都借鑑自 npmBundler,若是你對這兩個工具備所瞭解的話,就會在 composer 中發現他們的身影。Composer 包含了一個依賴解析器,用來處理開發包之間複雜的依賴關係;另外,它還包含了下載器、安裝器等有趣的東西。web

做爲一個用戶,你所要作的就是在 composer.json 文件中聲明當前項目所依賴的開發包,而後運行 composer.phar install 就好了。composer.json 文件定義了當前項目所依賴的開發包和 composer 的配置信息。下面是一個小型實例:sql

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

Packagist

Packagist 是 Composer 的默認的開發包倉庫。你能夠將本身的安裝包提交到 packagist,未來你在本身的 VCS (源碼管理軟件,好比 Github)倉庫中新建了 tag 或更新了代碼,packagist 都會自動構建一個新的開發包。這就是 packagist 目前的運做方式,未來 packagist 將容許直接上傳開發包。npm

2.包管理器

對於現代語言而言,包管理器基本上是標配。Java 有 Maven,Python 有 pip,Ruby 有 gem,Nodejs 有 npm。PHP 的則是 PEAR,不過 PEAR 坑很多:編程

  • 依賴處理容易出問題
  • 配置很是複雜
  • 難用的命令行接口

好在咱們有 Composer,PHP依賴管理的利器。它是開源的,使用起來也很簡單,提交本身的包也很容易。

3.依賴管理

Composer 不是一個包管理器。是的,它涉及 "packages" 和 "libraries",但它在每一個項目的基礎上進行管理,在你項目的某個目錄中(例如 vendor)進行安裝。默認狀況下它不會在全局安裝任何東西。所以,這僅僅是一個依賴管理。

這種想法並不新鮮,Composer 受到了 node's npm 和 ruby's bundler 的強烈啓發。而當時 PHP 下並無相似的工具。

Composer 將這樣爲你解決問題:

a) 你有一個項目依賴於若干個庫。

b) 其中一些庫依賴於其餘庫。

c) 你聲明你所依賴的東西。

d) Composer 會找出哪一個版本的包須要安裝,並安裝它們(將它們下載到你的項目中)。

4.聲明依賴關係

比方說,你正在建立一個項目,你須要一個庫來作日誌記錄。你決定使用 monolog。爲了將它添加到你的項目中,你所須要作的就是建立一個 composer.json 文件,其中描述了項目的依賴關係。

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

咱們只要指出咱們的項目須要一些 monolog/monolog 的包,從 1.2 開始的任何版本。

5.安裝 - *nix

下載 Composer 的可執行文件

局部安裝

要真正獲取 Composer,咱們須要作兩件事。首先安裝 Composer (一樣的,這意味着它將下載到你的項目中):

curl -sS https://getcomposer.org/installer | php

注意: 若是上述方法因爲某些緣由失敗了,你還能夠經過 php >下載安裝器:

php -r "readfile('https://getcomposer.org/installer');" | php

這將檢查一些 PHP 的設置,而後下載 composer.phar 到你的工做目錄中。這是 Composer 的二進制文件。這是一個 PHAR 包(PHP 的歸檔),這是 PHP 的歸檔格式能夠幫助用戶在命令行中執行一些操做。

你能夠經過 --install-dir 選項指定 Composer 的安裝目錄(它能夠是一個絕對或相對路徑):

curl -sS https://getcomposer.org/installer | php -- --install-dir=bin

全局安裝

你能夠將此文件放在任何地方。若是你把它放在系統的 PATH 目錄中,你就能在全局訪問它。 在類Unix系統中,你甚至能夠在使用時不加 php 前綴。

你能夠執行這些命令讓 composer 在你的系統中進行全局調用:

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

注意: 若是上訴命令由於權限執行失敗, 請使用 sudo 再次嘗試運行 mv 那行命令。

如今只須要運行 composer 命令就可使用 Composer 而不須要輸入 php composer.phar

全局安裝 (on OSX via homebrew)

Composer 是 homebrew-php 項目的一部分。

brew update
brew tap josegonzalez/homebrew-php
brew tap homebrew/versions
brew install php55-intl
brew install josegonzalez/php/composer

6.安裝 - Windows

使用安裝程序

這是將 Composer 安裝在你機器上的最簡單的方法。

下載而且運行 Composer-Setup.exe,它將安裝最新版本的 Composer ,並設置好系統的環境變量,所以你能夠在任何目錄下直接使用 composer 命令。

手動安裝

設置系統的環境變量 PATH 並運行安裝命令下載 composer.phar 文件:

C:\Users\username>cd C:\bin
C:\bin>php -r "readfile('https://getcomposer.org/installer');" | php

注意: 若是收到 readfile 錯誤提示,請使用 http 連接或者在 php.ini 中開啓 php_openssl.dll 。

composer.phar 同級目錄下新建文件 composer.bat

C:\bin>echo @php "%~dp0composer.phar" %*>composer.bat

關閉當前的命令行窗口,打開新的命令行窗口進行測試:

C:\Users\username>composer -V
Composer version 27d8904

7.使用 Composer

如今咱們將使用 Composer 來安裝項目的依賴。若是在當前目錄下沒有一個 composer.json 文件,請查看基本用法章節。

要解決和下載依賴,請執行 install 命令:

php composer.phar install

若是你進行了全局安裝,而且沒有 phar 文件在當前目錄,請使用下面的命令代替:

composer install

繼續 上面的例子,這裏將下載 monolog 到 vendor/monolog/monolog 目錄。

8.自動加載

除了庫的下載,Composer 還準備了一個自動加載文件,它能夠加載 Composer 下載的庫中全部的類文件。使用它,你只須要將下面這行代碼添加到你項目的引導文件中:

require 'vendor/autoload.php'; 

如今咱們就可使用 monolog 了!想要學習更多關於 Composer 的知識,請查看「基本用法」章節。

9.composer 命令的查看

在項目目錄下(若是是局部安裝的話),輸入composer 就能夠查看composer的版本信息和composer命令的幫助信息

輸入composer list 也能夠

爲了從命令行得到幫助信息,請運行 composer 或者 composer list 命令,而後結合 --help 命令來得到更多的幫助信息。

以下圖

 

 

10.composer.json:項目安裝

要開始在你的項目中使用 Composer,你只須要一個 composer.json 文件。該文件包含了項目的依賴和其它的一些元數據。

這個 JSON format 是很容易編寫的。它容許你定義嵌套結構。

11. 關於 require Key

第一件事情(而且每每只須要作這一件事),你須要在 composer.json 文件中指定 require key 的值。你只須要簡單的告訴 Composer 你的項目須要依賴哪些包。

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

你能夠看到, require 須要一個 包名稱 (例如 monolog/monolog) 映射到 包版本 (例如 1.0.*) 的對象。

12. 包名稱

包名稱由供應商名稱和其項目名稱構成。一般容易產生相同的項目名稱,而供應商名稱的存在則很好的解決了命名衝突的問題。它容許兩個不一樣的人建立一樣名爲 json 的庫,而以後它們將被命名爲 igorw/jsonseldaek/json

這裏咱們須要引入 monolog/monolog,供應商名稱與項目的名稱相同,對於一個具備惟一名稱的項目,咱們推薦這麼作。它還容許之後在同一個命名空間添加更多的相關項目。若是你維護着一個庫,這將使你能夠很容易的把它分離成更小的部分。

13. 包版本

在前面的例子中,咱們引入的 monolog 版本指定爲 1.0.*。這表示任何從 1.0 開始的開發分支,它將會匹配 1.0.01.0.2 或者 1.0.20

版本約束能夠用幾個不一樣的方法來指定。

名稱 實例 描述
確切的版本號 1.0.2 你能夠指定包的確切版本。
範圍 >=1.0 >=1.0,<2.0 >=1.0,<1.1|>=1.2 經過使用比較操做符能夠指定有效的版本範圍。
有效的運算符:>>=<<=!=
你能夠定義多個範圍,用逗號隔開,這將被視爲一個邏輯AND處理。一個管道符號|將做爲邏輯OR處理。
AND 的優先級高於 OR。
通配符 1.0.* 你可使用通配符*來指定一種模式。1.0.*>=1.0,<1.1是等效的。
賦值運算符 ~1.2 這對於遵循語義化版本號的項目很是有用。~1.2至關於>=1.2,<2.0。想要了解更多,請閱讀下一小節。

14. 下一個重要版本(波浪號運算符)

~ 最好用例子來解釋: ~1.2 至關於 >=1.2,<2.0,而 ~1.2.3 至關於 >=1.2.3,<1.3。正如你所看到的這對於遵循 語義化版本號 的項目最有用。一個常見的用法是標記你所依賴的最低版本,像 ~1.2 (容許1.2以上的任何版本,但不包括2.0)。因爲理論上直到2.0應該都沒有向後兼容性問題,因此效果很好。你還會看到它的另外一種用法,使用 ~ 指定最低版本,但容許版本號的最後一位數字上升。

注意: 雖然 2.0-beta.1 嚴格地說是早於 2.0,可是,根據版本約束條件, 例如 ~1.2 卻不會安裝這個版本。就像前面所講的 ~1.2 只意味着 .2 部分能夠改變,可是 1. 部分是固定的。

穩定性

默認狀況下只有穩定的發行版纔會被考慮在內。若是你也想得到 RC、beta、alpha 或 dev 版本,你可使用 穩定標誌。你能夠對全部的包作 最小穩定性 設置,而不是每一個依賴逐一設置。

 

15. 安裝依賴包

獲取定義的依賴到你的本地項目,只須要調用 composer.phar 運行 install 命令。

php composer.phar install

接着前面的例子,這將會找到 monolog/monolog 的最新版本,並將它下載到 vendor 目錄。 這是一個慣例把第三方的代碼到一個指定的目錄 vendor。若是是 monolog 將會建立 vendor/monolog/monolog 目錄。

小技巧: 若是你正在使用Git來管理你的項目, 你可能要添加 vendor 到你的 .gitignore 文件中。 你不會但願將全部的代碼都添加到你的版本庫中。

另外一件事是 install 命令將建立一個 composer.lock 文件到你項目的根目錄中。

16. composer.lock - 鎖文件  確切的版本號列表文件

在安裝依賴後,Composer 將把安裝時確切的版本號列表寫入 composer.lock 文件。這將鎖定改項目的特定版本。

請提交你應用程序的 composer.lock (包括 composer.json)到你的版本庫中

這是很是重要的,由於 install 命令將會檢查鎖文件是否存在,若是存在,它將下載指定的版本(忽略 composer.json 文件中的定義)。

這意味着,任何人創建項目都將下載與指定版本徹底相同的依賴。你的持續集成服務器、生產環境、你團隊中的其餘開發人員、每件事、每一個人都使用相同的依賴,從而減輕潛在的錯誤對部署的影響。即便你獨自開發項目,在六個月內從新安裝項目時,你也能夠放心的繼續工做,即便從那時起你的依賴已經發布了許多新的版本。

若是不存在 composer.lock 文件,Composer 將讀取 composer.json 並建立鎖文件。

這意味着若是你的依賴更新了新的版本,你將不會得到任何更新。此時要更新你的依賴版本請使用 update 命令。這將獲取最新匹配的版本(根據你的 composer.json 文件)並將新版本更新進鎖文件。

php composer.phar update

若是隻想安裝或更新一個依賴,你能夠白名單它們:

php composer.phar update monolog/monolog [...]

17. Packagist

packagist 是 Composer 的主要資源庫。 一個 Composer 的庫基本上是一個包的源:記錄了能夠獲得包的地方。Packagist 的目標是成爲你們使用庫資源的中央存儲平臺。這意味着你能夠 require 那裏的任何包。

當你訪問 packagist website (packagist.org),你能夠瀏覽和搜索資源包。

任何支持 Composer 的開源項目應該發佈本身的包在 packagist 上。雖然並不必定要發佈在 packagist 上來使用 Composer,但它使咱們的編程生活更加輕鬆。

18. 自動加載

對於庫的自動加載信息,Composer 生成了一個 vendor/autoload.php 文件。你能夠簡單的引入這個文件,你會獲得一個免費的自動加載支持。

require 'vendor/autoload.php'; 

這使得你能夠很容易的使用第三方代碼。例如:若是你的項目依賴 monolog,你就能夠像這樣開始使用這個類庫,而且他們將被自動加載。

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

你能夠在 composer.jsonautoload 字段中增長本身的 autoloader。

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

Composer 將註冊一個 PSR-4 autoloader 到 Acme 命名空間。

你能夠定義一個從命名空間到目錄的映射。此時 src 會在你項目的根目錄,與 vendor 文件夾同級。例如 src/Foo.php 文件應該包含 Acme\Foo 類。

添加 autoload 字段後,你應該再次運行 install 命令來生成 vendor/autoload.php 文件。

引用這個文件也將返回 autoloader 的實例,你能夠將包含調用的返回值存儲在變量中,並添加更多的命名空間。這對於在一個測試套件中自動加載類文件是很是有用的,例如。

$loader = require 'vendor/autoload.php'; $loader->add('Acme\\Test\\', __DIR__); 

除了 PSR-4 自動加載,classmap 也是支持的。這容許類被自動加載,即便不符合 PSR-0 規範。詳細請查看 自動加載-參考

注意: Composer 提供了本身的 autoloader。若是你不想使用它,你能夠僅僅引入 vendor/composer/autoload_*.php 文件,它返回一個關聯數組,你能夠經過這個關聯數組配置本身的 autoloader。

3.庫(資源包)

3.1 每個項目都是一個包

只要你有一個 composer.json 文件在目錄中,那麼整個目錄就是一個包。當你添加一個 require 到項目中,你就是在建立一個依賴於其它庫的包。你的項目和庫之間惟一的區別是,你的項目是一個沒有名字的包。

爲了使它成爲一個可安裝的包,你須要給它一個名稱。你能夠經過 composer.json 中的 name 來定義:

{
    "name": "acme/hello-world",
    "require": {
        "monolog/monolog": "1.0.*"
    }
}

在這種狀況下項目的名稱爲 acme/hello-world,其中 acme 是供應商的名稱。供應商的名稱是必須填寫的。

注意: 若是你不知道拿什麼做爲供應商的名稱, 那麼使用你 github 上的用戶名一般是不錯的選擇。 雖然包名不區分大小寫,但慣例是使用小寫字母,並用連字符做爲單詞的分隔。

3.2平臺軟件包

Composer 將那些已經安裝在系統上,但並非由 Composer 安裝的包視爲一個虛擬的平臺軟件包。這包括PHP自己,PHP擴展和一些系統庫。

  • php 表示用戶的 PHP 版本要求,你能夠對其作出限制。例如 >=5.4.0。若是須要64位版本的 PHP,你可使用 php-64bit 進行限制。

  • hhvm 表明的是 HHVM(也就是 HipHop Virtual Machine) 運行環境的版本,而且容許你設置一個版本限制,例如,'>=2.3.3'。

  • ext-<name> 能夠幫你指定須要的 PHP 擴展(包括核心擴展)。一般 PHP 拓展的版本能夠是不一致的,將它們的版本約束爲 * 是一個不錯的主意。一個 PHP 擴展包的例子:包名能夠寫成 ext-gd

  • lib-<name> 容許對 PHP 庫的版本進行限制。
    如下是可供使用的名稱:curliconviculibxmlopensslpcreuuidxsl

你可使用 composer show --platform 命令來獲取可用的平臺軟件包的列表。

3.3 鎖文件

若是你願意,能夠在你的項目中提交 composer.lock 文件。他將幫助你的團隊始終針對同一個依賴版本進行測試。任什麼時候候,這個鎖文件都只對於你的項目產生影響。

若是你不想提交鎖文件,而且你正在使用 Git,那麼請將它添加到 .gitignore 文件中。

3.4 發佈到 VCS(線上版本控制系統)

 4.命令行

4.1composer.json 的詳細解釋

常見的字段註釋說明

 

4.2 安裝 install

install 命令從當前目錄讀取 composer.json 文件,處理了依賴關係,並把其安裝到 vendor 目錄下。

php composer.phar install

若是當前目錄下存在 composer.lock 文件,它會今後文件讀取依賴版本,而不是根據 composer.json 文件去獲取依賴。這確保了該庫的每一個使用者都能獲得相同的依賴版本。

若是沒有 composer.lock 文件,composer 將在處理完依賴關係後建立它。

4.3更新 update

爲了獲取依賴的最新版本,而且升級 composer.lock 文件,你應該使用 update 命令。

php composer.phar update

這將解決項目的全部依賴,並將確切的版本號寫入 composer.lock

若是你只是想更新幾個包,你能夠像這樣分別列出它們:

php composer.phar update vendor/package vendor/package2

你還可使用通配符進行批量更新:

4.4 建立項目 create-project

你可使用 Composer 從現有的包中建立一個新的項目。這至關於執行了一個 git clonesvn checkout 命令後將這個包的依賴安裝到它本身的 vendor 目錄。

此命令有幾個常見的用途:

  1. 你能夠快速的部署你的應用。
  2. 你能夠檢出任何資源包,並開發它的補丁。
  3. 多人開發項目,能夠用它來加快應用的初始化。

要建立基於 Composer 的新項目,你可使用 "create-project" 命令。傳遞一個包名,它會爲你建立項目的目錄。你也能夠在第三個參數中指定版本號,不然將獲取最新的版本。

經過composer安裝laravel項目

composer create-project --prefer-dist laravel/laravel blog
composer create-project --prefer-dist laravel/laravel blog 5.4.* 

若是該目錄目前不存在,則會在安裝過程當中自動建立。

php composer.phar create-project doctrine/orm path 2.2.*

此外,你也能夠無需使用這個命令,而是經過現有的 composer.json 文件來啓動這個項目。

默認狀況下,這個命令會在 packagist.org 上查找你指定的包。

建立項目-參數

  • --repository-url: 提供一個自定義的儲存庫來搜索包,這將被用來代替 packagist.org。能夠是一個指向 composer 資源庫的 HTTP URL,或者是指向某個 packages.json 文件的本地路徑。
  • --stability (-s): 資源包的最低穩定版本,默認爲 stable
  • --prefer-source: 當有可用的包時,從 source 安裝。
  • --prefer-dist: 當有可用的包時,從 dist 安裝。
  • --dev: 安裝 require-dev 字段中列出的包。
  • --no-install: 禁止安裝包的依賴。
  • --no-plugins: 禁用 plugins。
  • --no-scripts: 禁止在根資源包中定義的腳本執行。
  • --no-progress: 移除進度信息,這能夠避免一些不處理換行的終端或腳本出現混亂的顯示。
  • --keep-vcs: 建立時跳過缺失的 VCS 。若是你在非交互模式下運行建立命令,這將是很是有用的。

 5.composer json的詳解

相關文章
相關標籤/搜索