PHP创建自己的Composer包方法


Posted in PHP onApril 09, 2018

仓库(Repository)

仓库是软件开发中常见的概念,与源(sources)意义相近,主要指托管资源的场所。许多软件都有仓库的概念,例如yum、npm、maven、Git,以及本文的主角Composer。仓库以中心化的方式托管资源,为软件的正常工作提供保障。

Packagist 是Composer默认的中央仓库,PHP社区的绝大部分Composer包都托管在该网站上。Packagist提供公开的、免费的托管服务,任何人均可注册、自由发布包,无需审核。Packagist由Private Packagist提供托管和维护,两者的主要区别为:Packagist的官网是https://packagist.org,托管...,托管的代码无需开源,仓库服务器可位于内网,提供更快、更高效的包代码托管服务。

可以配置多个仓库,Composer会自动找出最适合项目的依赖包。搜索包的流程如下:首先检查当前项目是否配置额外仓库,有则优先在额外仓库中检索;无结果向上到全局配置中的额外仓库检索;未配置或搜索无结果的情况下,回退到默认的Packagist中央仓库检索。除非禁用了默认的仓库,Packagist中的包总会被检索到。因为这个原因,Composer推荐PHP开发人员将包托管在Packagist网站上,方便他人检索和引用。

配置仓库

有两种方法对Composer的仓库进行配置:命令行和编辑配置文件。composer config是Composer配置的命令,可以用来配置项目或全局的仓库信息,例如:

composer config [-g] repo.packagist composer https://packagist.phpcomposer.com

第二种方法是编辑配置文件。编辑项目的composer.json或~/.config/composer/config.json,增加repositories一项配置,例如:

"repositories": {
  "packagist": {
    "type": "composer",
    "url": "https://packagist.phpcomposer.com"
  }
}

以上配置使用 Packagist中国全量镜像 网站作为默认中央仓库。在大陆地区部署PHP项目,建议使用该仓库目录,能加速依赖包的下载。

仓库配置最重要的两个参数是type和url。type指明仓库的类型,url则指向具体网址。根据仓库的位置,常用的type可选值有:

  1. composer,Composer包托管仓库,例如 Packagist中国全量镜像;
  2. vcs,版本控制管理系统,例如Github上的项目地址;
  3. pear,PEAR上的包;
  4. package,位于互联网上包;
  5. artifact,代码zip包合集;
  6. path,指向代码具体位置。

互联网上的仓库,type的常见值是composer和vcs;本地的项目,常见值是artifact和path。具体用例,可参考Composer官方文档。

掌握了仓库的概念和其配置,接下来我们创建自己的包。

创建自己的Composer包

创建一个Composer包只需两步:1. 填写包描述信息;2. 写代码。本文创建一个hello-composer的包来演示创建过程。该包功能只有一个:输出字符串“Hello, Composer!”。

Composer包的描述信息存放在composer.json文件中,可直接新建(或从其他项目拷贝)composer.json文件,手动填充必要的字段信息;也可以用composer init命令,交互式的输入包信息,生成composer.json文件后再补全其他字段信息。我们采取直接编辑文件的方式,在composer.json中输入如下内容:

{
  "name": "tlanyan/hello-composer",
  "description": "Hello, Composer!",
  "type": "library",
  "require": {
    "php": ">=7.0"
  },
  "license": "MIT",
  "authors": [
    {
      "name": "tlanyan",
      "email": "tlanyan@hotmail.com"
    }
  ],
  "minimum-stability": "stable",
  "autoload": {
    "psr-4": {
      "tlanyan\\": "src/"
    }
  }
}

以上内容基本上是一个Composer包的必备字段。其他字段可参考Composer官网的composer.json说明。需注意标记为root-only的字段,root-only表示当前包为主项目时才生效。例如require-dev字段,在当前项目中开发,字段内的包会下载放到vendor文件夹内;如果该项目被其他项目引用,则该字段的值被忽略,引用的包不会被下载。

接下来编写代码。在src目录下新建HelloComposer.php:

namespace tlanyan;

class HelloComposer
{
  public static function greet()
  {
    echo "Hello, Composer!", PHP_EOL;
  }
}

代码风格建议参考PSR-2规范,文件命名和路径规范建议参考PSR-4规范。另外需注意文件的路径需与composer.json中autoload的值相匹配。

通过简单两步,我们创建的自己的Composer包。接下来在其他项目中引用该包。

引用Composer包

新建一个test项目,引用上文创建的包并查看效果,步骤如下:

1.新建test文件夹,拷贝或者新建composer.json文件,配置如下:

{
    ....
    "require": {
      "tlanyan/hello-composer": "*"
    },
    "minimum-stability": "dev",
    "repositories": {
      "local": {
        "type": "path",
        "url": "/path/to/hello-composer"
      }
    },
    ....
  }

配置文件需要注意两点: 1. 如果hello-composer的composer.json文件没有version字段(或不是稳定版),minimum-stability值要是dev(默认是stable),否则无法安装; 2. 需添加自定义仓库,type值为path。

2.执行composer install -vvv安装依赖包,安装完成后vendor目录下生成tlanyan/hello-composer目录。

3.在test中新建Test.php文件,引用HelloComposer类:

namespace test;
  
  require "vendor/autoload.php";
  
  use tlanyan\HelloComposer;
  
  class Test
  {
    public static main()
    {
      HelloComposer::greet();
    }
  }
  
  Test::main();

.执行Test.php:php Test.php,输出"Hello, Composer!"。

通过配置Composer仓库,我们成功引用了创建的hello-composer包。测试没问题后,就可以发布到网上供其他人使用。下面简要说是发布流程。

发布Composer包

将Composer包发布到互联网的方式有几种:

  1. 打包成zip,上传到任意一个可公开访问的网站;
  2. 通过版本控制软件,上传到代码仓库;
  3. 提交到PEAR社区;
  4. 提交到私有的Composer仓库;
  5. 提交到Packagist。

前四种方式,需要用户配置仓库信息才能检索到包(PEAR社区几乎已死,可以忽略)。如果代码开源,建议提交到Packagist,方便全世界的PHP开发者检索和使用,为Composer生态做贡献。

提交包到Packagist,要经历以下过程:

  1. 在Github创建项目并提交代码;
  2. 在Packagist输入项目地址提交包;
  3. 在Github配置项目,触发Packagist自动更新。

前两步是必须的,第三步可选。本着为提交的包负责的态度,强烈建议完成第三步操作。

提交包的过程涉及到Github和Packagist两个站点,Github和Packagist之间的关系为:Github托管实际的代码和文件;Packagist托管包的作者、包名、版本号、下载量等元数据保。简要说Packagist是索引,Github是内容提供方。

详细步骤可参考官网指引或网上教程,网上相关内容太多,本文不再重复。

总结

本文介绍了Composer仓库的概念,创建了一个完整的Composer包,并给出提交包到Packagist的指引。用户掌握相关概念和运行机制后,可提交代码为社区做贡献,也可跳出Packagist自由的引用和安装依赖包。

PHP 相关文章推荐
一个简单的自动发送邮件系统(二)
Oct 09 PHP
使用网络地址转换实现多服务器负载均衡
Oct 09 PHP
php对大文件进行读取操作的实现代码
Jan 23 PHP
解析phpstorm + xdebug 远程断点调试
Jun 20 PHP
php 表单提交大量数据发生丢失的解决方法
Mar 03 PHP
PHP往XML中添加节点的方法
Mar 12 PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 PHP
YII2 实现多语言配置的方法分享
Jan 11 PHP
php查询及多条件查询
Feb 26 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
Laravel5.4框架中视图共享数据的方法详解
Sep 05 PHP
Bootstrap+PHP实现多图上传功能实例详解
Apr 08 #PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 #PHP
PHP面向对象之里氏替换原则简单示例
Apr 08 #PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
Apr 08 #PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
Apr 08 #PHP
PHP实现微信红包金额拆分试玩的算法示例
Apr 07 #PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
Apr 04 #PHP
You might like
php调用新浪短链接API的方法
2014/11/08 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
详解PHP归并排序的实现
2016/10/18 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
用jQuery技术实现Tab页界面之二
2009/09/21 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
简单理解JavaScript中的封装与继承特性
2016/03/19 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
js自定义Tab选项卡效果
2017/06/05 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
django框架F&Q 聚合与分组操作示例
2019/12/12 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
制冷与电控专业应届生求职信
2013/11/11 职场文书
酒后驾驶检讨书
2014/01/27 职场文书
食品采购员岗位职责
2014/04/14 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
年度考核个人总结
2015/03/06 职场文书
农业项目合作意向书
2015/05/08 职场文书
60句有关成长的名言
2019/09/04 职场文书