
發(fā)布流程
首先準(zhǔn)備好了GitHub帳號(hào)、Composer程序、Packagist帳號(hào),接下來是如何通過它們發(fā)布我們的Composer包。
- 創(chuàng)建GitHub倉庫:
默認(rèn)倉庫是空的,沒有任何代碼和分支(git空倉庫的特性),用git克隆到本地。 - 初始化 composer.json:
$ cd ~/work/github/
$ git clone git@github.com:yoho2021/hello-world.git
使用composer自帶的初始化命令(composer init),創(chuàng)建一個(gè)composer.json描述文件。如果想手動(dòng)編輯,可以去composer官網(wǎng)閱讀相關(guān)文檔獲得幫助。
再來添加一個(gè)readme,要不然打開github倉庫主頁的時(shí)候,總會(huì)提示讓你創(chuàng)建一個(gè)readme,有readme其實(shí)對(duì)其他小伙伴能快速了解這個(gè)包的功能有很大作用。
3.推送代碼:
到此為止我們已經(jīng)完成了倉庫的初始化:初始化composer描述文件,編寫readme文檔,接下來需要把代碼推送到GitHub。
$ git add ./
$ git commit -m 'init hello world package'
$ git push origin master
最后一步需要加origin master參數(shù)的原因是空倉庫是沒有分支的,所以我們需要強(qiáng)制推送本地的master到遠(yuǎn)端的master,在這之后可以直接用git push命令推送而不需要加后面的參數(shù)了。
- 發(fā)布到packagist.org:
訪問Packagist主頁,確認(rèn)自己已經(jīng)登錄,然后點(diǎn)擊右上角大大的submit,然后填入我們創(chuàng)建的倉庫的地址(如:https://github.com/yoho2021/hello-world.git),點(diǎn)擊Check,然后沒問題,再點(diǎn)擊Submit。
5.配置GitHub和Packagist之間的自動(dòng)更新鉤子:
根據(jù)向?qū)?,?fù)制自己的packagist的api token,然后去GitHub配置好倉庫的鉤子服務(wù),然后點(diǎn)擊服務(wù)名稱后面的筆圖標(biāo),進(jìn)去之后點(diǎn)Test service。如果services列表里的packagist前面是綠色的對(duì)鉤,說明成功了。
接著我們?cè)偃ackagist的hello-world包詳情頁面刷新,紅紅的警告沒有啦?。ㄈ绻@里還有,那么說明在GitHub創(chuàng)建的service填寫的資料有錯(cuò)誤,第一個(gè)是username,不是email地址,第二個(gè)是packagist api token,一定不要搞錯(cuò),第三個(gè)不需要填)。
6.測(cè)試安裝hello-world包:
$ composer require yoho2021/hello-world dev-master
注意:此處需要帶上dev-master
7.添加示例代碼:
首先我們編輯hello-world包倉庫代碼里的composer.json,加入autoload配置。
{
"name": "yoho2021/hello-world",
"description": "this is a hello world repo for composer.",
"license": "MIT",
"authors": [
{
"name": "zhouyang",
"email": "zhouyang2021@gmail.com"
}
],
"autoload": {
"psr-4": { "Yoho\Demo\": "src" }
},
"require": {}
}
這里我們添加了autoload屬性,并且是什么psr-4,這里我需要說一下,PSR-X是php-fig發(fā)布的一系列規(guī)范中的一個(gè)自動(dòng)加載規(guī)范,如果想要深入了解它的其他規(guī)則,請(qǐng)閱讀PHP-FIG。添加的配置代表我們定義了一個(gè)命名空間的起始目錄,比如src目錄里有一個(gè)Hello類文件(類名必須和文件名一致),那么要想通過autoload訪問它,必須把命名空間寫成namespace Yoho\Demo;。
$ cd ~/work/github/hello-world/
$ mkdir src
$ cd src/
$ touch Hello.php
<?php
namespace Yoho\Demo;
class Hello
{
private $name;
public function __construct( $name = 'World' )
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
public function hello()
{
return 'Hello '.$this->name.'!';
}
}
在提交代碼之前,我們需要自己先測(cè)試一遍我們的代碼是否有問題。
$ composer install
然后創(chuàng)建一個(gè)測(cè)試php文件,引入autoload,并且實(shí)例化一個(gè)我們的Hello類。
$ touch test.php
<?php
require_once "vendor/autoload.php";
$hello = new Yoho\Demo\Hello();
echo $hello->hello();
echo "\n";
$obj = new Yoho\Demo\Hello('Hello world');
echo $obj->hello();
推送這些新代碼到GitHub,因?yàn)槲覀兣渲昧算^子服務(wù),所以在推送之后不久,GitHub會(huì)通知Packagist倉庫有更新,然后小伙伴們就輕松的拿到你的更新的代碼啦!
包版本管理
至此我們已經(jīng)可以把自己的代碼發(fā)布到線上了,但是有一個(gè)問題,別人的包都有版本號(hào),而我們的安裝需要手動(dòng)指定dev-master要不然composer會(huì)說找不到stable版本,這里我們就需要引入版本和分支概念了,composer包的版本是來自于git的分支和tag,分支代表dev版本(除master外),tag代表stable版本,因?yàn)檎碚f,大家都是這樣管理項(xiàng)目的版本的,所以直接無痛模式切換,自由方便。下面我們就來模擬一下如何發(fā)布輕量級(jí)的版本(相對(duì)使用私鑰簽署tag并發(fā)布的過程)。
$ git branch
我們會(huì)看到綠色的master前面有個(gè)星號(hào),說明當(dāng)前工作分支是master,那么對(duì)應(yīng)的composer包的版本就是dev-master,是不是有些熟悉了。接下來我們創(chuàng)建一個(gè)0.1分支,作為我們0.1版本的迭代分支,并基于它提交一些代碼,然后推送。
$ git checkout -b 0.1
比如我們編輯readme,添加使用示例(雖然我們?cè)?.1分支開發(fā)和提交,但是我們一定要在特性或者bug修復(fù)的工作完成之后,合并回master)。
$ git add .
$ git commit -m 'update readme, add Hello class demo'
$ git push origin 0.1
因?yàn)槲覀儎?chuàng)建的0.1分支在遠(yuǎn)端是不存在的,所以要指定推送到遠(yuǎn)端的0.1,GitHub會(huì)自動(dòng)創(chuàng)建一個(gè)0.1分支,和master是一樣的。這個(gè)時(shí)候我們?cè)倏纯次覀兊膆ello-world包的版本,使用composer show yoho2021/hello-world命令查看。
但是只有dev是不夠的,很多線上的版本依賴的都是stable,肯定不會(huì)讓一個(gè)dev包上去的,這個(gè)時(shí)候,我們覺得可以發(fā)布一個(gè)穩(wěn)定版本了,那么在0.1分支上,我們發(fā)布一個(gè)0.1.0版本。
$ git tag 0.1.0
$ git push --tags
推送成功之后,用composer命令查看一下版本信息,是不是有了一個(gè)0.1.0的stable版本了呢!到此為止,基本的發(fā)布流程就講完啦!