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 相关文章推荐
PHP 防恶意刷新实现代码
May 16 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
如何在symfony中导出为CSV文件中的数据
Oct 06 PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 PHP
php curl模拟post请求小实例
Nov 13 PHP
PHP安全的URL字符串base64编码和解码
Jun 19 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
php获取ip及网址的简单方法(必看)
Apr 01 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 25 PHP
PHP中define() 与 const定义常量的区别详解
Jun 25 PHP
Laravel Eloquent ORM 多条件查询的例子
Oct 10 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生成百度sitemap站点地图类函数实例
2014/10/17 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
PHP中数组转换为SimpleXML教程
2019/01/27 PHP
js 深拷贝函数
2008/12/04 Javascript
input 高级限制级用法
2009/03/26 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
Jquery中"$(document).ready(function(){ })"函数的使用详解
2013/12/30 Javascript
将数字转换成大写的人民币表达式的js函数
2014/09/21 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
js实现延迟加载的几种方法详解
2019/01/19 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
使用Eclipse如何开发python脚本
2018/04/11 Python
python读取中文txt文本的方法
2018/04/12 Python
python在每个字符后添加空格的实例
2018/05/07 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
Django命名URL和反向解析URL实现解析
2019/08/09 Python
Django分组聚合查询实例分享
2020/04/29 Python
HTML5实现应用程序缓存(Application Cache)
2020/06/16 HTML / CSS
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
大学生实习证明范本
2014/01/15 职场文书
奶茶店创业计划书
2014/08/14 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS