发布流程
首先准备好了GitHub帐号、Composer程序、Packagist帐号,接下来是如何通过它们发布我们的Composer包。
- 创建GitHub仓库:
默认仓库是空的,没有任何代码和分支(git空仓库的特性),用git克隆到本地。 - 初始化 composer.json:
$ cd ~/work/github/
$ git clone git@github.com:yoho2021/hello-world.git
使用composer自带的初始化命令(composer init),创建一个composer.json描述文件。如果想手动编辑,可以去composer官网阅读相关文档获得帮助。
再来添加一个readme,要不然打开github仓库主页的时候,总会提示让你创建一个readme,有readme其实对其他小伙伴能快速了解这个包的功能有很大作用。
3.推送代码:
到此为止我们已经完成了仓库的初始化:初始化composer描述文件,编写readme文档,接下来需要把代码推送到GitHub。
$ git add ./
$ git commit -m 'init hello world package'
$ git push origin master
最后一步需要加origin master参数的原因是空仓库是没有分支的,所以我们需要强制推送本地的master到远端的master,在这之后可以直接用git push命令推送而不需要加后面的参数了。
- 发布到packagist.org:
访问Packagist主页,确认自己已经登录,然后点击右上角大大的submit,然后填入我们创建的仓库的地址(如:https://github.com/yoho2021/hello-world.git),点击Check,然后没问题,再点击Submit。
5.配置GitHub和Packagist之间的自动更新钩子:
根据向导,复制自己的packagist的api token,然后去GitHub配置好仓库的钩子服务,然后点击服务名称后面的笔图标,进去之后点Test service。如果services列表里的packagist前面是绿色的对钩,说明成功了。
接着我们再去packagist的hello-world包详情页面刷新,红红的警告没有啦!(如果这里还有,那么说明在GitHub创建的service填写的资料有错误,第一个是username,不是email地址,第二个是packagist api token,一定不要搞错,第三个不需要填)。
6.测试安装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发布的一系列规范中的一个自动加载规范,如果想要深入了解它的其他规则,请阅读PHP-FIG。添加的配置代表我们定义了一个命名空间的起始目录,比如src目录里有一个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.'!';
}
}
在提交代码之前,我们需要自己先测试一遍我们的代码是否有问题。
$ composer install
然后创建一个测试php文件,引入autoload,并且实例化一个我们的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,因为我们配置了钩子服务,所以在推送之后不久,GitHub会通知Packagist仓库有更新,然后小伙伴们就轻松的拿到你的更新的代码啦!
包版本管理
至此我们已经可以把自己的代码发布到线上了,但是有一个问题,别人的包都有版本号,而我们的安装需要手动指定dev-master要不然composer会说找不到stable版本,这里我们就需要引入版本和分支概念了,composer包的版本是来自于git的分支和tag,分支代表dev版本(除master外),tag代表stable版本,因为正常来说,大家都是这样管理项目的版本的,所以直接无痛模式切换,自由方便。下面我们就来模拟一下如何发布轻量级的版本(相对使用私钥签署tag并发布的过程)。
$ git branch
我们会看到绿色的master前面有个星号,说明当前工作分支是master,那么对应的composer包的版本就是dev-master,是不是有些熟悉了。接下来我们创建一个0.1分支,作为我们0.1版本的迭代分支,并基于它提交一些代码,然后推送。
$ git checkout -b 0.1
比如我们编辑readme,添加使用示例(虽然我们在0.1分支开发和提交,但是我们一定要在特性或者bug修复的工作完成之后,合并回master)。
$ git add .
$ git commit -m 'update readme, add Hello class demo'
$ git push origin 0.1
因为我们创建的0.1分支在远端是不存在的,所以要指定推送到远端的0.1,GitHub会自动创建一个0.1分支,和master是一样的。这个时候我们再看看我们的hello-world包的版本,使用composer show yoho2021/hello-world命令查看。
但是只有dev是不够的,很多线上的版本依赖的都是stable,肯定不会让一个dev包上去的,这个时候,我们觉得可以发布一个稳定版本了,那么在0.1分支上,我们发布一个0.1.0版本。
$ git tag 0.1.0
$ git push --tags
推送成功之后,用composer命令查看一下版本信息,是不是有了一个0.1.0的stable版本了呢!到此为止,基本的发布流程就讲完啦!