如何在本地開發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使用。
