对于不了解composer的同窗来讲,确定会有这个疑问。php
这个单词常常在网上看到,特别是在 GitHub 中,在使用 Laravel
、Yii
时也常常看到这个词,在安装的时候推荐使用 composer 安装?难道只是安装的时候使用吗?我也使用过其余框架,为何 Thinkphp
、Codeigniter
不用composer安装呢?html
带着这些疑问,咱们进行学习。laravel
composer 官方网址:www.phpcomposer.comgit
composer 是 PHP(5.3+) 用来管理依赖关系的工具。程序员
长久以来,PHP的开源方式都是项目级的,就是说一开源就是一个项目,好比一整套的CMS(Dede、WordPress、discuz)、一整套框架(Thinkphp、Codeigniter)。为啥呢?其中一个很重要的缘由是你很差拆开,若是拆开的话,没有一个有效的管理工具组合起来,致使拆开的小模块你们无人问津。github
而后 composer 出现了,它就是一个有效的管理工具,它负责管理你们拆开的小模块,而后进行有效的整合,使之成为一个完整的项目。web
好比,记录日志使用 monolog/monolog ,HTTP client使用:guzzlehttp/guzzle 等等。json
composer 包的平台:packagist.org,这里面包含了大量的优秀的安装包,咱们就很轻松一个 composer 命令就能够将优秀的代码用到咱们项目中来。api
做为一名骄傲PHPer,咱们总不能永远只使用别人的开发包,咱们必须本身动手开发一个包给别人用,给本身用。bash
咱们既然知道了它有这么多的好处,就让咱们去学习他吧,先从 composer 的安装提及。
官方入门文档:docs.phpcomposer.com/00-intro.ht…
经过上述的方法,能够进行安装完成。
接下来咱们以 GitHub 结合 Composer 工具来进行示例讲解如何开发一个 Composer 包。
好比,开发一个处理数字的 composer 包。
至此,表示在GitHub上已经建立了一个名为“numberFormat”的空项目。
接下来,须要将远程的项目 clone 到本地(Git命令行、Git客户端)进行编码。
composer.json 有哪些参数,如何编写,请参考文档:docs.phpcomposer.com/04-schema.h…
一个项目要调用开发包,经过composer.json就能够知道该样去加载文件。
composer.json 可使用两个方式建立,一种是composer init
,另外一种是手工建立。
我们一块儿先执行下composer init
看看效果。
在本地建立numberFormat目录,而后 git clone 刚才建立的项目。
//进入到本地numberFormat目录
composer init
Welcome to the Composer config generator
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [root/number-format]:number-format/number-format
Description []:一个处理数字的包
Author [XinLiang <109760455@qq.com>, n to skip]: //回车
Minimum Stability []: //回车
Package Type (e.g. library, project, metapackage, composer-plugin) []: //回车
License []: //回车
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]?no
Would you like to define your dev dependencies (require-dev) interactively [yes]?no
{
"name": "number-format/number-format",
"description": "一个处理数字的包",
"authors": [
{
"name": "XinLiang",
"email": "109760455@qq.com"
}
],
"require": {}
}
Do you confirm generation [yes]? //回车
复制代码
至此,本地numberFormat目录就看到 composer.json 文件了,固然能够直接在目录下按照这个格式进行手工建立,后期直接编辑该文件便可。
开发包结构以下:
--src 源码目录(必须)
--tests 单元测试目录(非必须)
咱们按照既定的目录结构去建立目录和文件,而后再到composer.json里面修改一下便可。
接下来,在src目录中建立一个类(NumberFormat.php):
/**
* 数字格式化类
* @author XinLiang
*/
namespace numberFormat;
class NumberFormat
{
/**
* 格式化字节
* @param int $num 数字
* @param int $precision 精准度
* @return string
*/
public static function byte_format($num = 0, $precision = 1)
{
if ($num >= 1000000000000)
{
$num = round($num / 1099511627776, $precision);
$unit = 'TB';
}
elseif ($num >= 1000000000)
{
$num = round($num / 1073741824, $precision);
$unit = 'GB';
}
elseif ($num >= 1000000)
{
$num = round($num / 1048576, $precision);
$unit = 'MB';
}
elseif ($num >= 1000)
{
$num = round($num / 1024, $precision);
$unit = 'KB';
}
else
{
return number_format($num).' Bytes';
}
return number_format($num, $precision).' '.$unit;
}
}
复制代码
修改 composer.json
{
"name": "number-format/number-format",
"description": "一个处理数字的包",
"authors": [
{
"name": "XinLiang",
"email": "109760455@qq.com"
}
],
"minimum-stability": "dev",
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-4": {
"numberFormat\\": "src/"
}
},
"license": "MIT"
}
复制代码
至此,咱们的开发包已经完成,接下来咱们来测试下这个包是否可用。
在本地numberFormat目录下,经过composer install
安装
composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Writing lock file
Generating autoload files
//表示安装成功
复制代码
惊奇的发现,在本地numberFormat目录多一个vendor
目录。
在tests目录建立 NumberFormatTest.php
/**
* 数字格式化测试类
* @author XinLiang
*/
require '../vendor/autoload.php';
use \numberFormat;
$number = '102400010';
echo numberFormat\NumberFormat::byte_format($number);
//输出:97.7 MB
复制代码
至此,测试成功,接下来就是要发布到packagist平台,给广大开发者见面了。
packagist.org 为 composer 安装包的平台(可用GitHub帐号登陆)。
恭喜你,这个开发包能够在任何支持 composer 的PHP框架中使用了。
那么问题来了,刚才咱们的包写的有的简陋,后期咱们维护代码,新增代码还须要按照原来的方式操做一遍吗?
不!由于咱们能够在GitHub平台设置代码更新,同时能让 packagist.org 自动更新,是否是很酷!
在GitHub中找到代码仓库,而后选择"settings" -> “Webhooks” ,默认是绑定自动更新的。
若是未绑定,能够这样设置:"settings" -> “Webhooks” -> "Add webhook" ->
至此,后期咱们更新代码后会自动同步到 packagist.org 上。
//其余开发者能够这样获取包
composer require number-format/number-format:dev-master
复制代码
为何会有:dev-master,为何引用其余的包不用这样设置?
由于咱们引用的其余包都是稳定包,默认为:-stable。
是由于咱们 composer.json 中设置了 minimum-stability 属性,这个能够了解下“版本约束”,在这就很少说了。
当咱们在发布包后,若是获取不到报错怎么办,有多是镜像的问题。
//查看全局设置
composer config -gl
//第一种:设置国内镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com
//第二种:设置国内镜像
composer config -g repo.packagist composer https://packagist.laravel-china.org
//第三种:设置国内镜像
composer config -g repos.packagist composer https://php.cnpkg.org
复制代码
经过这篇文章,解决了上述提到的三个问题:
看完后,是否是以为 Composer 包开发原来这么简单,做为骄傲的程序员,去开发属于本身的 Composer 包吧!