如何在本地開發Compoer包
周煦辰
2019-05-26
記錄一下如何在本地開發一個Composer包,以及如何發布到Packgist。
假設你要開發一個名叫xuchen/biubiubiu
的包。
准備工作
你得保證你的系統用已經安裝了
- Git
- PHP與Composer
並且保證在命令行中都可以使用
准備一個空項目用於測試
我們首先需要在本地新建一個空的Composer項目,用來生成autoload.php
文件,以及在其vendor
目錄中引入我們之后開發完成的包來進行測試。當然,如果你已經有一個正在開發中的項目,例如一個基於Laravel
框架的項目,那么你可以跳過目前這一步。
具體可以先看一下Composer的文檔,如何初始化一個項目。
假設我們需要在D盤新建我們的空項目,名稱為composer-workspace
,則新建如下目錄
d:/composer-workspace
在剛剛新建的目錄中打開命令行,使用如下命令初始化空項目
composer init
composer會引導你輸入各種參數來完成包的創建,名字填寫<your-name>/composer-workspace
即可,其他參數全部默認。我們就假設這個項目叫xuchen/composer-workspace
吧。
完成以上的步驟后,我們就能在composer-wokspace
目錄下看到一個composer.json
文件。
去Github上開個新坑
又到了每個程序員喜聞樂見的環節:去Github上開個新坑。當然了,這次我們希望能把這個Repo完善。
我們得假設你的包還未作為一個Composer包開發。至於為什么要這么假設,大部分的包,都是業務代碼寫着寫着發現可以抽象出一個通用的包來使用,於是想着遷移到一個單獨Composer包中。當然了,前提是:
- 原本的代碼就是你的個人項目,沒有使用你的上班時間及公司設備來開發。
- 或者,公司支持你的開源行為。
既然是新的包,我們自然要去Github上開個新坑,,Github上開新坑的步驟我就不贅述了。在Github上開一個Repo的目的並不僅僅是為了代碼管理,最后我們想要將代碼發布到Packgist也需要用到Github。
假設我們新開的GithubRepo叫Biubiubiu
好了。
Clone你的Repo並放到隨便什么位置
在Github上開好新坑了,就需要把代碼Clone下來,我們就放在如下位置吧:
d:/workspace/biubiubiu
使用Composer初始化你的項目
到上一步的代碼目錄中,運行:
composer init
name
填寫xuchen/biubiubiu
,description
隨便,stability
填dev
,require
暫時可以不填,等到composer.json
文件生成之后再說。
一路火花帶閃電,項目的composer.json
生成了,一個初始化狀態的composer.json
非常簡陋,但是問題不大:
{
"name": "xuchen/biubiubiu",
"minimum-stability": "dev"
}
規定代碼的命名空間
接下來就要把代碼放進來了,關於這塊,你可以先看看Composer自動加載文檔。
要用到autoload
,我們就需要規定好我們包代碼的命名空間,假設biubiubiu
這個包的命名空間是Xuchen\Biubiubiu\<ClassName>
,且代碼放在<包的根目錄>/src
目錄下,則需要對composer.json
做如下修改:
{
"name": "xuchen/tencent-cos",
"minimum-stability": "dev",
"autoload": {
"psr-4": {
"Xuchen\\Biubiubiu\\": "src/"
}
}
}
autoload
字段中規定了我們需要自動載入的代碼,從上述代碼中可以看到:規定了命名空間為Xuchen\Biubiubiu
,該命名空間對應的代碼目錄在<包的根目錄>/src
下。
到composer-workspace中引入包
現在我們要回過頭在最開始創建的項目中引入xuchen/biubiubiu
。
修改d:/composer-worksapce/composer.json
,加入repositories
字段:
{
"name": "xuchen/composer-workspace",
"repositories": {
"xuchen/biubiubiu": {
"type": "path",
"url": "d:/workspace/biubiubiu",
"options": {
"symlink": true
}
},
}
}
在當前目錄(d:/composer-worksapce
)下,運行:
composer require xuchen/biubiubiu @dev
完成之后,你會發現在當前目錄的vendor
中出現了xuchen/biubiubiu
的symlink
。此時,正在開發中的xuchen/biubiubiu
包已經正確引入到了composer-workspace
這個項目中。
寫一個測試類
到剛剛規定的<包的根目錄>/src
下新建一個測試類,就命名為Demo.php
好了:
<?php
namespace Xuchen\Biubiubiu;
/**
* Class Demo
* @package Xuchen\Biubiubiu
*/
class Demo
{
public static function execute()
{
echo 'It works!';
}
}
測試包是否已正確引入
到composer-workspace
項目根目錄下新建一個php腳本,命名為test-autoload.php
:
<?php
use Xuchen\Biubiubiu\Demo;
require_once './vendor/autoload.php';
Demo::execute();
在當前目錄打開命令行,使用如下命令
php -f test-autoload.php
會看到命令行上輸出:
It works!
這表明xuchen/biubiubiu
包中的Demo.php
已經通過Composer的自動載入功能正確載入到了composer-workspace
項目中。
項目依賴
假如xuchen/biubiubiu
項目依賴其他的包,例如常用的Guzzle。
在biubiubiu
的composer.json
中加入如下依賴:
{
"name": "xuchen/tencent-cos",
"minimum-stability": "dev",
"require": {
"guzzlehttp/guzzle": "^6.3"
},
"autoload": {
"psr-4": {
"Xuchen\\Biubiubiu\\": "src/"
}
}
}
在composer-workspace
項目中使用命令行:
composer update
Composer會在composer-workspace
中安裝Guzzle,如此便可在xuchen/biubiubiu
中直接引入Guzzle使用。