周煦辰
2019-05-26php
記錄一下如何在本地開發一個Composer包,以及如何發佈到Packgist。html
假設你要開發一個名叫xuchen/biubiubiu
的包。git
你得保證你的系統用已經安裝了程序員
而且保證在命令行中均可以使用github
咱們首先須要在本地新建一個空的Composer項目,用來生成autoload.php
文件,以及在其vendor
目錄中引入咱們以後開發完成的包來進行測試。固然,若是你已經有一個正在開發中的項目,例如一個基於Laravel
框架的項目,那麼你能夠跳過目前這一步。json
具體能夠先看一下Composer的文檔,如何初始化一個項目。bash
假設咱們須要在D盤新建咱們的空項目,名稱爲composer-workspace
,則新建以下目錄composer
d:/composer-workspace
在剛剛新建的目錄中打開命令行,使用以下命令初始化空項目框架
composer init
composer會引導你輸入各類參數來完成包的建立,名字填寫<your-name>/composer-workspace
便可,其餘參數所有默認。咱們就假設這個項目叫xuchen/composer-workspace
吧。測試
完成以上的步驟後,咱們就能在composer-wokspace
目錄下看到一個composer.json
文件。
又到了每一個程序員喜聞樂見的環節:去Github上開個新坑。固然了,此次咱們但願能把這個Repo完善。
咱們得假設你的包還未做爲一個Composer包開發。至於爲何要這麼假設,大部分的包,都是業務代碼寫着寫着發現能夠抽象出一個通用的包來使用,因而想着遷移到一個單獨Composer包中。固然了,前提是:
既然是新的包,咱們天然要去Github上開個新坑,,Github上開新坑的步驟我就不贅述了。在Github上開一個Repo的目的並不單單是爲了代碼管理,最後咱們想要將代碼發佈到Packgist也須要用到Github。
假設咱們新開的GithubRepo叫Biubiubiu
好了。
在Github上開好新坑了,就須要把代碼Clone下來,咱們就放在以下位置吧:
d:/workspace/biubiubiu
到上一步的代碼目錄中,運行:
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
下。
如今咱們要回過頭在最開始建立的項目中引入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使用。