Composer 介紹
Composer 是一套 PHP 的套件管理工具,是一支 Phar 的執行程式(Phar 會將程式打包成一隻執行檔)。
特點
- 針對專案安裝
- 支援版本控制系統當下載來源,例如 git or svn
- 設定檔使用 JSON格式(composer.json)
- 自動處理母套件與子套件的相依性(不符合時就不安裝)
所有的 package 都是透過 composer.json
控制,使用 Composer 時通常由 root-package 統一管理。
安裝
因應版本不同,實際內容可以直接參考 官網
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
安裝完以後的指令會是 composer.phar
,通常大家習慣用的還是 composer
,因此在安裝時可以先透過指定好 filename 。
php composer-setup.php --filename=composer
基本操作
# init composer.json
composer init
# init 時順便加入套件(加入 -n 參數後,系統在 init 時不會有任何互動提問)
composer init --require=foo/bar:1.0.0 -n
# 加入新 vendor 進 composer.json,並且安裝
composer require "foo/bar:1.0.0"
# 查看指令及選項
composer list
# 升級Composer
composer self-update
# 更新套件
composer update
# 更新特定套件
composer update foo/bar
# 只更新lock檔
composer update --lock
# 查看已安裝的套件
composer show -i
Init 之後的 composer.json
{
"name": "johnsonlu/test",
"description": "This is a Composer Test",
"license": "proprietary",
"authors": [
{
"name": "JohnsonLu",
"email": "johnson4932@gmail.com"
}
],
"require": {
"php": ">=5.3.0"
}
}
基本設定說明: 名稱 |
功用 |
---|---|
name | 套件名稱,通常會是以 vendor/project 的方式命名。 |
minimum-stability | 套件穩定度,分別有 stable 、RC 、beta 、alpha 、dev 。 |
license | 專案的 license,可以參考 SPDX 的 Identifier,私人專案可以使用 proprietary 。 |
require | 該專案要載入的套件 |
require-dev | 該專案在載入的套件(開發模式) |
專案應用
在專案中,套件管理都是透過專案根目錄的 composer.json 來控管,以裝 phpmailer
為例:
{
"require": {
"phpmailer/phpmailer": ">=5.2.7"
}
"require-dev": {
"phpunit/phpunit": ">=3.7.0"
}
}
版本選擇
版本的選擇方式有幾種:
- 直接指定版號,例如
5.2.7
- 使用
*
指定次版號,例如5.2.*
表示版號大於等於5.2.0
,小於5.3.0
的版本 - 使用比較運算子,例如:
>5.2
、>=5.2
、!=5.2
、<=5.2
、<5.2
等 - 使用
~
在版號前,表示下一個版號變動之前的版本。(~1.2
等同於>=1.2
和<2.0.0
) - 在版號之後,可以加上不同的 stability flag,例如
5.2.*@beta
安裝套件
Composer 預設安裝套件時,會去 packagist 搜尋,如果有想要 release 自己套件的記得上去註冊,這樣一來大家就可以自由使用你的套件了。
# 安裝 compoesr.json 中所有套件,包含 require-dev(test)
composer install
# 安裝 require(production)
composer install --no-dev
安裝完畢後會出現 composer.lock 檔案與 vendor 資料夾。
名稱 | 功用 |
---|---|
composer.lock | 紀錄載入套件的版本資訊 |
vendor | 存放載入套件的 source 及自動生成的 autoload.php |
開發時只要載入 composer 建立出來的 autoload 程式即可使用。
require "vendor/autoload.php";
new PHPMailer;
安裝其他來源的套件
安裝不在套件庫私有的 git 套件(VCS來源:git
、svn
)時, composer.json 中需要從 repositories
定義位置,可以透過 dev-branch
選擇載入哪一個 branch。
{
"require": {
"johnsonlu/test": "dev-master"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/johnson4932/test"
}
]
}
另外,也可以直接用 dev-master#commit-hash
決定從哪一個 commit 開始載入。
Notice: 這裡有個前提,引用的套件必須有自己的 composer.json,這樣 composer 才有辦法辨別專案名稱。
利用 Autoload 載入內部元件
Composer 提供了 autoload 設定專案內部元件的載入,autoload
可以支援許多不同型態的載入方法。
Composer 會自動生成 vendor/autoload.php
載入外部套件,而外部套件的內部元件載入則是由該套件 compsoer.json
中的 autoload
決定。
Autoload 範例
{
"autoload": {
"psr-4": {
"POD\\Metadata\\": "src/"
},
"classmap": ["class.say.php"],
"files": ["function.php"]
}
}
單獨更新 Autoload
composer dump-autoload
安裝沒有 composer.json 的外部套件
如果需要安裝沒有使用 composer 的外部套件時,需要透過 package
type 安裝,且須自行在 composer.json
設定載入路徑。
載入 zip 檔
{
"repositories": [
{
"type": "package",
"package": {
"name": "phpQuery/phpQuery",
"version": "0.9.5",
"dist": {
"url": "https://github.com/TobiaszCudnik/phpquery/archive/master.zip",
"type": "zip"
},
"autoload": {
"psr-0": {"phpQuery":"phpQuery/"}
}
}
}
],
"require": {
"phpQuery/phpQuery": "0.9.*"
}
}
載入 source
{
"repositories": [
{
"type": "package",
"package": {
"name": "JohnsonLu/xxaudio",
"version": "master",
"source": {
"url": "git@git.johnsonlu.org:xxaudio",
"type": "git",
"reference": "master"
},
"autoload": {
"psr-0": {
"XX_": "xxlibs-audio/"
}
}
}
}
],
"require": {
"JohnsonLu/xxaudio": "dev-master"
}
}
直接安裝專案
有些專案並非套件,且已經將 composer.json
的目錄結構定義好了,Composer 可以透過 create-project
建立並使用。( 例如 Laravel )
# --prefer-dist 等同加入 install 和 update
composer create-project laravel/laravel path --prefer-dist