动手写一个composer包并发布到composer包管理中心packagist

很多PHP朋友可能听说过PSR规范和composer,但不知道如何制作一个composer包,并发布到composer包管理中心packagist上,这里以一个实际项目为例来讲述下。

一、准备工作

  • 申请github账号
  • 已经安装git
  • 已经安装composer
  • 在github上创建一个仓库,注意仓库名建议使用-连接单词,如php-document-creator,不能使用驼峰法,如phpDocumentCreator,github并没有这个限制,但packagist上面有这个限制。

二、开始工作

1、将github上面刚创建的项目克隆到本地,如我的项目地址为:http://github.com/shixinke/php-document-creator
  1. #克隆项目到本地
  2. git clone git@github.com:shixinke/php-document-creator.git
  3. #进入项目目录
  4. cd php-document-creator
  5. #配置git账户
  6. git config --local user.name "shixinke"
  7. git config --local user.email "ishixinke@qq.com"
2、使用composer初始化项目
  1. composer init

根据提示填写(或者手动生成也可),生成一个composer.json的文件,内容如下:

  1. {
  2. "name": "shixinke/php-document-creator",
  3. "description": "a document creator for php extension",
  4. "type": "library",
  5. "repositories": [
  6. {
  7. "url" : "http://github.com/shixinke/php-document-creator"
  8. }
  9. ],
  10. "homepage":"http://www.shixinke.com",
  11. "license": "Apache 2.0",
  12. "authors": [
  13. {
  14. "name": "shixinke",
  15. "email": "ishixinke@qq.com",
  16. "homepage" : "http://www.shixinke.com"
  17. }
  18. ],
  19. "require": {
  20. "php" : ">=5.3.0"
  21. },
  22. "autoload":{
  23. "psr-4":{
  24. "phpDocumentCreator\\":"/src/phpDocumentCreator"
  25. }
  26. }
  27. }

值得注意的几点:

  • name这个一定要使用-来分割单词,不能使用驼峰法,否则没法通过packagilst的命名规则
  • require用来指定依赖的环境或类库包
  • autoload指定自动加载的规则,psr-4表示使用PSR-4的规范
    “phpDocumentCreator\“:”/src/phpDocumentCreator”表示在使用phpDocumentCreator这个命名空间时,其实访问的路径是 /src/phpDocumentCreator
3、建立目录规范

详情说明请参照:http://www.php-fig.org/psr/psr-4/

PSR-4的目录规范为:

|-vendor/
       |-vendor_name/
             package_name/
                   src/
                         ClassName.php # 具体的类
                   tests/
                         ClassNameTest.php # 测试类文件

我们使用github,那么vendor_name和package_name就已经确定了,如我的vendor_name即为shixinke,package_name为php-document-creator,所以我们只需要培养src和tests两个文件夹

src/

      phpDocumentCreator

            Tool.php

            Document.php

            Transform.php

tests/

      docTest.php

注:这里的phpDocumentCreator这个目录可有可无

4、功能实现

这里以Tool.php为例

  1. <?php
  2. namespace phpDocumentCreator;
  3. class Tool
  4. {
  5. public static function getName()
  6. {
  7. return "Tool";
  8. }
  9. }

建立一个自动加载类库的文件:

根目录下建立:Autoloader.php

  1. <?php
  2. defined('ROOT_PATH') or define('ROOT_PATH', dirname(__DIR__));
  3. spl_autoload_register(function($class){
  4. $prefix = 'phpDocumentCreator\\';
  5. $baseDir = ROOT_PATH . '/src/';
  6. $len = strlen($prefix);
  7. if (strncmp($prefix, $class, $len) !== 0) {
  8. return;
  9. }
  10. //$relativeClass = substr($class, $len);
  11. $file = $baseDir . str_replace('\\', '/', $class) . '.php';
  12. if (file_exists($file)) {
  13. require $file;
  14. }
  15. });

建立测试文件tests/docTest.php

  1. <?php
  2. define('ROOT_PATH', dirname(__DIR__));
  3. require_once ROOT_PATH.'/Autoloader.php';
  4. echo \phpDocumentCreator\Tool::getName()
5、写说明文件README.md

主要是项目说明、用法等,使用markdown语法

这个文件在项目的根目录

三、发布代码

1、把代码先发布到github上:
  1. git add .
  2. git commit -m "代码更新"
  3. git push
2、在packagist上注册账号,有github账号可以直接登录。

验证不通过一般有以下几个原因:

github地址不合法,一般认为github的用户名为vendor_name,不能使用驼峰,项目名称为package_name,也不能使用驼峰
composer.json文件不合法
验证通过后,就可以看到相应的页面,如:

https://packagist.org/packages/shixinke/php-document-creator