Composer
Dependency Manager for PHP
從官網副標可知Composer 是一套PHP函式庫相依性管理工具,提供專案內各相依函式庫管理(版本定義、下載安裝、引用及移除等 ),原本是在Symfony這個PHP Framework中,設計來管理套件相依性的工具,因其方便性而成為一個獨立開發計畫。
為何不稱作函式庫或套件管理工具呢?
一般套件管理,類似Yum等,安裝套件後是套用在整個系統 (Global),而 Composer 所安裝的套件只針對單一專案 ( Local ),甚至不能稱之為安裝,或許稱為下載引用更為恰當,每個套件也可能會引用到其他套件的物件或函式,於是相依性產生,當我們引用這個套件,也必須連同其相依的子套件一起引用進來,在專案中記錄及管理這些套件與專案間的交互引用的關係即所謂的相依管理。
Composer is not a package manager in the same sense as Yum or Apt are. Yes, it deals with "packages" or libraries, but it manages them on a per-project basis, installing them in a directory (e.g. vendor) inside your project. By default it does not install anything globally. Thus, it is a dependency manager. It does however support a "global" project for convenience via the global command.
套件相依性
(摘自 https://speakerdeck.com/jaceju/begining-composer)
( 參考 Composer官網、某有心單位製作 composer 官網中文化網站 )
一、安裝
Composer工具程式主要是有一支.phar執行檔 ( php程式壓縮打包檔 ),可透過php composer.phar 來執行composer指令,若安裝windows版本的composer執行檔,就可直接在temianl視窗以command line形式執行 ( composer + 指令集 )。用法上類似OS X的homebrew,或Linux的yum。
Windows 安裝
直接下載Composer-Setup.exe並安裝,就可以在Terminal視窗下執行composer指令。
如果想試試手動安裝,請參考Composer官網手動安裝文件
Linux like 安裝
可透過terminal方式安裝,如下
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '55d6ead61b29c7bdee5cccfb50076874187bd9f21f65d8991d46ec5cc90518f447387fb9f76ebae1fbbacf329e583e30') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
也可透過curl來安裝
curl -sS https://getcomposer.org/installer | php
執行時,則下 > php composer.phar + composer指令,亦可按下述步驟,將composer.phar 複製到/usr/local/bin,並改檔名為composer,如同windows版本一樣,簡化composer執行的方式:
> mv composer.phar composer
> chmod +x composer
二、使用
在一個準備採用Composer管理的php專案,其根目錄下先建立一個composer.json (格式如下,可視為Composer 套件相依腳本,以下compose.json例子是指該專案準備相依套用 phpmailer 這套郵件發送函式庫,版本採用含5.2.7以上,請參考套件版本描述 )
{
"require": { "phpmailer/phpmailer": "~5.2.7" }
}
( 範例及說明引用 http://ithelp.ithome.com.tw/articles/10136653)
上述範例的 "require" 除了是json 的鍵值(key)外,同時也是 composer 命令列指令 ( 請參考 composer command line interface )。
當composer執行命令時,會參考此檔並自動至 Packagist下載安裝或更新腳本內所描述的套件,或者也可以在沒有compose.json狀況下,直接下 composer指令來安裝套件,composer 會自動產生或修改 composer.json 腳本及其他相關檔案 ( composer.lock 、autoload.php 等 ),分別舉例說明:
A. 按照 composer.json腳本檔來安裝套件
執行下列指令:( Teminal路徑要在專案的根目錄下 )
php composer.phar install 或 composer install (首次)
或 composer update ( 首次套用composer之後,執行後會修改完腳本 )
B. 亦可直接透過 composer 命令列指令來執行安裝 phpmailer 套件
可執行下列指令 ( Teminal路徑要在專案的根目錄下 )
php composer.phar require phpmailer/phpmailer
或 composer require phpmailer/phpmailer
C. 套件安裝後,目錄下有甚麼變化?
Composer.json
如上所述,執行安裝套件指令時,會參考此檔,但如果原本專案根目錄下沒有composer.json檔,可自行編寫或執行 composer init 自動產生json格式空檔,或執行 composer require (套件名稱),執行完會自動更新composer.json。
Composer.lock
執行完套件安裝或更新時,會在專案根目錄下自動產生或更新 composer.lock,裡面會記錄套件版本資訊,此檔案功能是為了鎖定套件版本,當執行安裝時,登錄在此檔的套件將不會自動更新,可避免產生不預期的更新而造成災難,同時也可以統一所有開發環境的套件版本。
vendor目錄
composer會在此目錄建立 autoload.php,並將套件相關程式檔案都安裝在此目錄下 ( 例如: vendor/phpmailer/phpmailer ),採vendor name / package name 的目錄形式來建立套件目錄。
自動載入的載入器(loader)與快取檔放在vendor/composer下
vendor/autoload.php
專案的程式碼中包含此檔此檔,即可套用載入Composer所安裝的套件,例如:程式內的第一行加入即可,如下
<?php
require 'vendor/autoload.php';
$phpmailer = new PHPMailer;
三、關於 Composer.json 寫法:
關於Composer.json schema 屬性( json key )
請參考 composer document about json schema,在此介紹幾個常用的compose.json 屬性如下:
Name
專案名稱或套件名稱
Version
專案版本,若是一個發佈到Packagist 的專案,由於採用VCS repositories ( 有版本控制的Github ),則不建議加入本屬性,當版本若與VCS不一致時將會出現錯誤。
Require ( Require-dev)
相依套件內容、套件連結
Type
專案模式,共分四類
- library 此為預設,適用一般開發模式,會將套件檔案複製到vendor目錄下
project 指定本專案是一個framework框架規模,而非library,例如Laravel,會從無到有安裝整個框架程式及命名空間
metapackage 指定為一個空殼的專案架構,不會產生或安裝任何檔案
composer-plugin 說明本專案為一個packagist 的套件(非框架)
autoload
可以指定自動載入PSR規範(psr-0、psr-4)、類別名稱對應檔(classmap)、非類別檔需但需一開始載入的檔案(file)
PSR規範:
指定命名空間與目錄 (相對於套件根路徑,例如: vendor ) 的對應模式提供autoload的依據,Composer目前支援兩種版本PSR-4、PSR-0
PSR4範例:指定命名空間Monolog對應到目錄 /vendor/src
{
"autoload": { "psr-4": { "Monolog\\": "src/", "Vendor\\Namespace\\": "" }, "classmap":["classes/","Something.php"], "files":["src/myLibrary/functions.php"] }
}
如果你需要在多個目錄中搜尋相同命名空間前綴, 你可以像這樣指定他們為一個陣列:
{
"autoload": { "psr-4": { "Monolog\\": \["src/", "lib/"\] } }
}
如果你想要有一個任何(不指定)命名空間可以用的備用目錄, 你可以像這樣使用一個空命名空間前綴:
{
"autoload": { "psr-4": { "": "src/" } }
}
套件版本範圍限制描述
上述composer.json範例中,"phpmailer/phpmailer":"~5.2.7" 表示 phpmailer 套件採用5.2.7以上版本,但小於5.3.0,且不含5.3.0,以下分別說明各種版本範圍參數的用法:
Exact ( 精確描述 )
例如:1.0.2
Range ( 區間範圍描述,>、>=、<、<=、!=、空白及逗點代表AND、||代表OR )
例如: >=1.0 <1.1 || >=1.2
Range (Hyphen - )
例如:1.0-2.0 相當於 >=1.0 且 < 2.1 ( <= 2.0.* )
Wildcard (*)
例如:1.0.* 相當於 >=1.0 <1.1
Tilde(~)
例如:1.2.3 相當於 >=1.2.3 < 1.3.0 ( 1.2.* 最後位數可變 )
Caret(^)
例如:^1.2.3 相當於 >=1.2.3 < 2.0.0 ( 1.*.* 第一位數固定,其他位數可變 )
Stability(-stable or -dev)
判斷原則 -dev (>=, < ) -stable( =, >, <= )
例如:
=1.2.3 相當於 = 1.2.3-stable
>1.2 相當於 >1.2.0.0-stable
>=1.2 相當於 >=1.2.0.0-dev
>=1.2-stable 相當於 >=1.2.0.0-stable
<1.3 相當於 <1.3.0.0-dev
<=1.3 相當於 <=1.3.0.0-stable
1 - 2 相當於 >=1.0.0.0-dev <3.0.0.0-dev
~1.3 相當於 >=1.3.0.0-dev <2.0.0.0-dev
1.4.* 相當於 >=1.4.0.0-dev <1.5.0.0-dev
四、Composer 指令介面 (command-line interface )
請參考 Composer document - Composer command-line interface,可在Terminal視窗執行 composer list 列出所有指令及說明,指令執行方式:
php composer.phar 指令
composer 指令
以下介紹幾組常用指令
init
compose init 在目前執行指令的目錄,產生一個最基本的composer.json檔案,指令執行過程會詢問package name、package type 等按Enter使用預設值即可。
install
composer install 依據composer.json、composer.lock (如果存在此檔,以此檔內容優先,安裝後不會修改此檔案 ) 安裝相依的套件。
updatea
composer update 依據composer.lock更新所有相依套件到最新版本,並更新composer.lock
composer udpate vendor/package 更新特定套件
show ( 同info )
composer show 顯示已安裝套件及其版本
depends
composer depends vendor/package 顯示該套件的相依套件
require
composer require vendor/package:version 安裝套件 ( 同步更新composer.json, .lock )
範例:
composer require phpmailer/phpmailer
composer global require "laravel/installer=~1.1" 安裝 Laravel框架
( composer create-project laravel/laravel --prefer-dist 亦可安裝 Laravel framework skeleton )
remove
composer remove vendor/package 移除套件 ( 同步更新 composer.json , .lock )
outdated
composer outdated 顯示是否有套件過期或新版本釋出
五、注意事項
- 只有專案負責人才做第一次install及之後的update
- 其他成員一律使用 composer install
- root-package的composer.json及composer.lock要放在版本控制系統裡,其他成員才可以直接使用。
Library的composer.lock則不要放在版本控制系統
vendor 資料夾不要列入版本控制系統,其他成員應以 composer install來安裝