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 套件穩定度,分別有 stableRCbetaalphadev
license 專案的 license,可以參考 SPDX 的 Identifier,私人專案可以使用 proprietary
require 該專案要載入的套件
require-dev 該專案在載入的套件(開發模式)

專案應用

在專案中,套件管理都是透過專案根目錄的 composer.json 來控管,以裝 phpmailer 為例:

{
    "require": {
        "phpmailer/phpmailer": ">=5.2.7"
    }
    "require-dev": {
        "phpunit/phpunit": ">=3.7.0"
    }
}

版本選擇

版本的選擇方式有幾種:

  1. 直接指定版號,例如 5.2.7
  2. 使用 * 指定次版號,例如 5.2.* 表示版號大於等於 5.2.0,小於 5.3.0 的版本
  3. 使用比較運算子,例如:>5.2>=5.2!=5.2<=5.2<5.2
  4. 使用 ~ 在版號前,表示下一個版號變動之前的版本。( ~1.2 等同於 >=1.2<2.0.0
  5. 在版號之後,可以加上不同的 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來源:gitsvn)時, 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
Categories: PHP