Composer 包开发竟然这么简单

composer 是用来干吗的?

对于不了解composer的同窗来讲,确定会有这个疑问。php

这个单词常常在网上看到,特别是在 GitHub 中,在使用 LaravelYii 时也常常看到这个词,在安装的时候推荐使用 composer 安装?难道只是安装的时候使用吗?我也使用过其余框架,为何 ThinkphpCodeigniter 不用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 的安装提及。

composer 是如何安装的?

官方入门文档:docs.phpcomposer.com/00-intro.ht…

经过上述的方法,能够进行安装完成。

接下来咱们以 GitHub 结合 Composer 工具来进行示例讲解如何开发一个 Composer 包。

composer 包是如何开发的?

好比,开发一个处理数字的 composer 包。

在 GitHub上 建立一个项目

  1. 登陆 GitHub(若是没有帐号,请进行建立),点击右上角“+”,选择“New repository”。
  2. 在建立界面中,Repository name 填写“numberFormat”,Description是选填的,暂时先不填, 接着在 Public(GitHub推荐的方式,免费,全部人都能访问)和 Private(收费,指定人才能访问,2019-01-09后对我的开发者免费了)中选择“Public”,接着在勾选“Initialize this repository with a README”,点击“Create Repository”按钮后建立成功。

至此,表示在GitHub上已经建立了一个名为“numberFormat”的空项目。

接下来,须要将远程的项目 clone 到本地(Git命令行、Git客户端)进行编码。

学习建立 composer.json

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 平台

packagist.org 为 composer 安装包的平台(可用GitHub帐号登陆)。

  1. 现将本地代码提交到GitHub。
  2. 发布到 packagist 平台,登陆后在首页的右上角有一个"Submit"按钮,点击便可进入开发包提交的界面。在“Repository URL (Git/Svn/Hg)”输入框中,输入GitHub项目的地址,点击“Check”按钮,稍微等待几秒钟,会显示验证成功,并显示出“Submit”按钮,点击即完成了开发包的提交了。

恭喜你,这个开发包能够在任何支持 composer 的PHP框架中使用了。

那么问题来了,刚才咱们的包写的有的简陋,后期咱们维护代码,新增代码还须要按照原来的方式操做一遍吗?

不!由于咱们能够在GitHub平台设置代码更新,同时能让 packagist.org 自动更新,是否是很酷!

在GitHub中找到代码仓库,而后选择"settings" -> “Webhooks” ,默认是绑定自动更新的。

若是未绑定,能够这样设置:"settings" -> “Webhooks” -> "Add webhook" ->

  1. Payload URL填写:“packagist.org/api/github”
  2. Content type填写:“application/json”
  3. Secret填写:“packagist提供的token”
  4. 其余的默认便可
  5. 点击“Add webhook” 完成。

至此,后期咱们更新代码后会自动同步到 packagist.org 上。

//其余开发者能够这样获取包
composer require number-format/number-format:dev-master
复制代码

为何会有:dev-master,为何引用其余的包不用这样设置?

由于咱们引用的其余包都是稳定包,默认为:-stable。

是由于咱们 composer.json 中设置了 minimum-stability 属性,这个能够了解下“版本约束”,在这就很少说了。

当咱们在发布包后,若是获取不到报错怎么办,有多是镜像的问题。

composer 设置镜像地址

//查看全局设置
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
复制代码

小结

经过这篇文章,解决了上述提到的三个问题:

  1. composer 是用来干吗的?
  2. composer 是如何安装的?
  3. composer 包是如何开发的?

看完后,是否是以为 Composer 包开发原来这么简单,做为骄傲的程序员,去开发属于本身的 Composer 包吧!

原文地址

Composer 入门后,接下来该看看这篇文章了