轉載請註明文章出處:tlanyan.me/php-review-…php
前文 PHP回顧之Composer 簡要介紹了Composer的相關概念和簡要用法,應付平常開發已無大礙。想要更好的利用Composer協同工做,學會建立本身的Composer包是一項必不可少的技能。本文先講解Composer倉庫的概念,再給出建立和發佈Composer包的步驟。git
倉庫是軟件開發中常見的概念,與源(sources)意義相近,主要指託管資源的場所。許多軟件都有倉庫的概念,例如yum、npm、maven、Git,以及本文的主角Composer。倉庫以中心化的方式託管資源,爲軟件的正常工做提供保障。github
Packagist 是Composer默認的中央倉庫,PHP社區的絕大部分Composer包都託管在該網站上。Packagist提供公開的、免費的託管服務,任何人都可註冊、自由發佈包,無需審覈。Packagist由Private Packagist提供託管和維護,二者的主要區別爲:Packagist的官網是packagist.org,託管開源代碼,面向公衆提供免費包託管服務;Private Packagist的官網是packagist.com,託管的代碼無需開源,倉庫服務器可位於內網,提供更快、更高效的包代碼託管服務。web
能夠配置多個倉庫,Composer會自動找出最適合項目的依賴包。搜索包的流程以下:首先檢查當前項目是否配置額外倉庫,有則優先在額外倉庫中檢索;無結果向上到全局配置中的額外倉庫檢索;未配置或搜索無結果的狀況下,回退到默認的Packagist中央倉庫檢索。除非禁用了默認的倉庫,Packagist中的包總會被檢索到。由於這個緣由,Composer推薦PHP開發人員將包託管在Packagist網站上,方便他人檢索和引用。數據庫
有兩種方法對Composer的倉庫進行配置:命令行和編輯配置文件。composer config
是Composer配置的命令,能夠用來配置項目或全局的倉庫信息,例如:npm
composer config [-g] repo.packagist composer https://packagist.phpcomposer.com
複製代碼
第二種方法是編輯配置文件。編輯項目的composer.json
或~/.config/composer/config.json
,增長repositories
一項配置,例如:json
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
}
}
複製代碼
以上配置使用 Packagist中國全量鏡像 網站做爲默認中央倉庫。在大陸地區部署PHP項目,建議使用該倉庫目錄,能加速依賴包的下載。bash
倉庫配置最重要的兩個參數是type
和url
。type
指明倉庫的類型,url
則指向具體網址。根據倉庫的位置,經常使用的type
可選值有:服務器
互聯網上的倉庫,type
的常見值是composer
和vcs
;本地的項目,常見值是artifact
和path
。具體用例,可參考Composer官方文檔。cookie
掌握了倉庫的概念和其配置,接下來咱們建立本身的包。
建立一個Composer包只需兩步:1. 填寫包描述信息;2. 寫代碼。本文建立一個hello-composer
的包來演示建立過程。該包功能只有一個:輸出字符串「Hello, Composer!
」。
Composer包的描述信息存放在composer.json
文件中,可直接新建(或從其餘項目拷貝)composer.json
文件,手動填充必要的字段信息;也能夠用composer init
命令,交互式的輸入包信息,生成composer.json
文件後再補全其餘字段信息。咱們採起直接編輯文件的方式,在composer.json
中輸入以下內容:
{
"name": "tlanyan/hello-composer",
"description": "Hello, Composer!",
"type": "library",
"require": {
"php": ">=7.0"
},
"license": "MIT",
"authors": [
{
"name": "tlanyan",
"email": "tlanyan@hotmail.com"
}
],
"minimum-stability": "stable",
"autoload": {
"psr-4": {
"tlanyan\\": "src/"
}
}
}
複製代碼
以上內容基本上是一個Composer包的必備字段。其餘字段可參考Composer官網的composer.json說明。需注意標記爲root-only的字段,root-only表示當前包爲主項目時才生效。例如require-dev
字段,在當前項目中開發,字段內的包會下載放到vendor
文件夾內;若是該項目被其餘項目引用,則該字段的值被忽略,引用的包不會被下載。
接下來編寫代碼。在src
目錄下新建HelloComposer.php
:
namespace tlanyan;
class HelloComposer
{
public static function greet()
{
echo "Hello, Composer!", PHP_EOL;
}
}
複製代碼
代碼風格建議參考PSR-2規範,文件命名和路徑規範建議參考PSR-4規範。另外需注意文件的路徑需與composer.json
中autoload
的值相匹配。
經過簡單兩步,咱們建立的本身的Composer包。接下來在其餘項目中引用該包。
新建一個test項目,引用上文建立的包並查看效果,步驟以下:
composer.json
文件,配置以下:{
....
"require": {
"tlanyan/hello-composer": "*"
},
"minimum-stability": "dev",
"repositories": {
"local": {
"type": "path",
"url": "/path/to/hello-composer"
}
},
....
}
複製代碼
配置文件須要注意兩點: 1. 若是hello-composer的composer.json
文件沒有version
字段(或不是穩定版),minimum-stability
值要是dev
(默認是stable
),不然沒法安裝; 2. 需添加自定義倉庫,type
值爲path
。
執行composer install -vvv
安裝依賴包,安裝完成後vendor目錄下生成tlanyan/hello-composer
目錄。
在test中新建Test.php文件,引用HelloComposer類:
namespace test;
require "vendor/autoload.php";
use tlanyan\HelloComposer;
class Test
{
public static main()
{
HelloComposer::greet();
}
}
Test::main();
複製代碼
php Test.php
,輸出"Hello, Composer!
"。經過配置Composer倉庫,咱們成功引用了建立的hello-composer
包。測試沒問題後,就能夠發佈到網上供其餘人使用。下面簡要說是發佈流程。
將Composer包發佈到互聯網的方式有幾種:
前四種方式,須要用戶配置倉庫信息才能檢索到包(PEAR社區幾乎已死,能夠忽略)。若是代碼開源,建議提交到Packagist,方便全世界的PHP開發者檢索和使用,爲Composer生態作貢獻。
提交包到Packagist,要經歷如下過程:
前兩步是必須的,第三步可選。本着爲提交的包負責的態度,強烈建議完成第三步操做。
提交包的過程涉及到Github和Packagist兩個站點,Github和Packagist之間的關係爲:Github託管實際的代碼和文件;Packagist託管包的做者、包名、版本號、下載量等元數據保。簡要說Packagist是索引,Github是內容提供方。
詳細步驟可參考官網指引或網上教程,網上相關內容太多,本文再也不重複。
本文介紹了Composer倉庫的概念,建立了一個完整的Composer包,並給出提交包到Packagist的指引。用戶掌握相關概念和運行機制後,可提交代碼爲社區作貢獻,也可跳出Packagist自由的引用和安裝依賴包。