composer 是用來幹嘛的?
對於不瞭解composer的同學來說,肯定會有這個疑問。
這個單詞經常在網上看到,特別是在 GitHub 中,在使用 Laravel
、Yii
時也經常看到這個詞,在安裝的時候推薦使用 composer 安裝?難道只是安裝的時候使用嗎?我也使用過其他框架,為什麼 Thinkphp
、Codeigniter
不用composer安裝呢?
帶著這些疑問,我們進行學習。
composer 官方網址:www.phpcomposer.com
composer 是 PHP(5.3+) 用來管理依賴關係的工具。
長久以來,PHP的開源方式都是專案級的,就是說一開源就是一個專案,比如一整套的CMS(Dede、WordPress、discuz)、一整套框架(Thinkphp、Codeigniter)。為啥呢?其中一個很重要的原因是你不好拆開,如果拆開的話,沒有一個有效的管理工具組合起來,導致拆開的小模組大家無人問津。
然後 composer 出現了,它就是一個有效的管理工具,它負責管理大家拆開的小模組,然後進行有效的整合,使之成為一個完整的專案。
比如,記錄日誌使用 monolog/monolog ,HTTP client使用:guzzlehttp/guzzle 等等。
composer 包的平臺:packagist.org,這裡麵包含了大量的優秀的安裝包,我們就很輕鬆一個 composer 命令就可以將優秀的程式碼用到我們專案中來。
作為一名驕傲PHPer,我們總不能永遠只使用別人的開發包,我們必須自己動手開發一個包給別人用,給自己用。
我們既然知道了它有這麼多的好處,就讓我們去學習他吧,先從 composer 的安裝說起。
composer 是如何安裝的?
官方入門文件:docs.phpcomposer.com/00-intro.ht…
通過上述的方法,可以進行安裝完成。
接下來我們以 GitHub 結合 Composer 工具來進行示例講解如何開發一個 Composer 包。
composer 包是如何開發的?
比如,開發一個處理數字的 composer 包。
在 GitHub上 建立一個專案
- 登入 GitHub(如果沒有賬號,請進行建立),點選右上角“+”,選擇“New repository”。
- 在建立介面中,Repository name 填寫“numberFormat”,Description是選填的,暫時先不填, 接著在 Public(GitHub推薦的方式,免費,所有人都能訪問)和 Private(收費,指定人才能訪問,2019-01-09後對個人開發者免費了)中選擇“Public”,接著在勾選“Initialize this repository with a README”,點選“Create Repository”按鈕後建立成功。
至此,表示在GitHub上已經建立了一個名為“numberFormat”的空專案。
接下來,需要將遠端的專案 clone 到本地(Git命令列、Git客戶端)進行編碼。
學習建立 composer.json
composer.json 有哪些引數,如何編寫,請參考文件:docs.phpcomposer.com/04-schema.h…
一個專案要呼叫開發包,通過composer.json就可以知道該樣去載入檔案。
composer.json 可以使用兩個方式建立,一種是composer init
,另一種是手工建立。
我們們一起先執行下composer init
看看效果。
在本地建立numberFormat目錄,然後 git clone 剛才建立的專案。
//進入到本地numberFormat目錄
composer init
Welcome to the Composer config generator
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [root/number-format]:number-format/number-format
Description []:一個處理數字的包
Author [XinLiang <109760455@qq.com>, n to skip]: //回車
Minimum Stability []: //回車
Package Type (e.g. library, project, metapackage, composer-plugin) []: //回車
License []: //回車
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]?no
Would you like to define your dev dependencies (require-dev) interactively [yes]?no
{
"name": "number-format/number-format",
"description": "一個處理數字的包",
"authors": [
{
"name": "XinLiang",
"email": "109760455@qq.com"
}
],
"require": {}
}
Do you confirm generation [yes]? //回車
複製程式碼
至此,本地numberFormat目錄就看到 composer.json 檔案了,當然可以直接在目錄下按照這個格式進行手工建立,後期直接編輯該檔案即可。
建立專案編碼內容
開發包結構如下:
--src 原始碼目錄(必須)
--tests 單元測試目錄(非必須)
我們按照既定的目錄結構去建立目錄和檔案,然後再到composer.json裡面修改一下即可。
接下來,在src目錄中建立一個類(NumberFormat.php):
/**
* 數字格式化類
* @author XinLiang
*/
namespace numberFormat;
class NumberFormat
{
/**
* 格式化位元組
* @param int $num 數字
* @param int $precision 精準度
* @return string
*/
public static function byte_format($num = 0, $precision = 1)
{
if ($num >= 1000000000000)
{
$num = round($num / 1099511627776, $precision);
$unit = 'TB';
}
elseif ($num >= 1000000000)
{
$num = round($num / 1073741824, $precision);
$unit = 'GB';
}
elseif ($num >= 1000000)
{
$num = round($num / 1048576, $precision);
$unit = 'MB';
}
elseif ($num >= 1000)
{
$num = round($num / 1024, $precision);
$unit = 'KB';
}
else
{
return number_format($num).' Bytes';
}
return number_format($num, $precision).' '.$unit;
}
}
複製程式碼
修改 composer.json
{
"name": "number-format/number-format",
"description": "一個處理數字的包",
"authors": [
{
"name": "XinLiang",
"email": "109760455@qq.com"
}
],
"minimum-stability": "dev",
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-4": {
"numberFormat\\": "src/"
}
},
"license": "MIT"
}
複製程式碼
至此,我們的開發包已經完成,接下來我們來測試下這個包是否可用。
測試開發包
在本地numberFormat目錄下,通過composer install
安裝
composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Writing lock file
Generating autoload files
//表示安裝成功
複製程式碼
驚奇的發現,在本地numberFormat目錄多一個vendor
目錄。
在tests目錄建立 NumberFormatTest.php
/**
* 數字格式化測試類
* @author XinLiang
*/
require '../vendor/autoload.php';
use \numberFormat;
$number = '102400010';
echo numberFormat\NumberFormat::byte_format($number);
//輸出:97.7 MB
複製程式碼
至此,測試成功,接下來就是要釋出到packagist平臺,給廣大開發者見面了。
釋出到 packagist 平臺
packagist.org 為 composer 安裝包的平臺(可用GitHub賬號登入)。
- 現將原生程式碼提交到GitHub。
- 釋出到 packagist 平臺,登入後在首頁的右上角有一個"Submit"按鈕,點選即可進入開發包提交的介面。在“Repository URL (Git/Svn/Hg)”輸入框中,輸入GitHub專案的地址,點選“Check”按鈕,稍微等待幾秒鐘,會顯示驗證成功,並顯示出“Submit”按鈕,點選即完成了開發包的提交了。
恭喜你,這個開發包可以在任何支援 composer 的PHP框架中使用了。
那麼問題來了,剛才我們的包寫的有的簡陋,後期我們維護程式碼,新增程式碼還需要按照原來的方式操作一遍嗎?
不!因為我們可以在GitHub平臺設定程式碼更新,同時能讓 packagist.org 自動更新,是不是很酷!
在GitHub中找到程式碼倉庫,然後選擇"settings" -> “Webhooks” ,預設是繫結自動更新的。
如果未繫結,可以這樣設定:"settings" -> “Webhooks” -> "Add webhook" ->
- Payload URL填寫:“packagist.org/api/github”
- Content type填寫:“application/json”
- Secret填寫:“packagist提供的token”
- 其他的預設即可
- 點選“Add webhook” 完成。
至此,後期我們更新程式碼後會自動同步到 packagist.org 上。
//其他開發者可以這樣獲取包
composer require number-format/number-format:dev-master
複製程式碼
為什麼會有:dev-master,為什麼引用其他的包不用這樣設定?
因為我們引用的其他包都是穩定包,預設為:-stable。
是因為我們 composer.json 中設定了 minimum-stability 屬性,這個可以瞭解下“版本約束”,在這就不多說了。
當我們在釋出包後,如果獲取不到報錯怎麼辦,有可能是映象的問題。
composer 設定映象地址
//檢視全域性設定
composer config -gl
//第一種:設定國內映象
composer config -g repo.packagist composer https://packagist.phpcomposer.com
//第二種:設定國內映象
composer config -g repo.packagist composer https://packagist.laravel-china.org
//第三種:設定國內映象
composer config -g repos.packagist composer https://php.cnpkg.org
複製程式碼
小結
通過這篇文章,解決了上述提到的三個問題:
- composer 是用來幹嘛的?
- composer 是如何安裝的?
- composer 包是如何開發的?
看完後,是不是覺得 Composer 包開發原來這麼簡單,作為驕傲的程式設計師,去開發屬於自己的 Composer 包吧!