开发 Composer 包详细步骤

博客分类: software 阅读次数: comments

开发 Composer 包详细步骤

安装

Wondows 平台

Wondows 平台上,我们只需要下载 Composer-Setup.exe 后,一步步安装即可。
需要注意的是你需要开启 openssl 配置,我们打开 php 目录下的 php.ini,将 extension=php_openssl.dll 前面的分号去掉就可以了。
安装成功后,我们可以通过命令窗口(cmd) 输入 composer --version 命令来查看是否安装成功。

Linux 或 Mac OS 平台

可以使用以下命令来安装:

$ php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
$ php composer-setup.php

All settings correct for using Composer
Downloading...

Composer (version 1.6.5) successfully installed to: /root/composer.phar
Use it: php composer.phar
$ php -r "unlink('composer-setup.php');"
$ mv composer.phar /usr/local/bin/composer

准备

本地工作区创建文件夹 red-packets,初始化项目,生成composer.json文件。

步骤

$ mkdir red-packets
$ cd red-packets
$ composer init
  Welcome to the Composer config generator



This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [canren/red-packets]: canren/red-packets
Description []: red packets
Author [canren <sxffind@126.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]?
Search for a package:
Would you like to define your dev dependencies (require-dev) interactively [yes]?
Search for a package:

{
    "name": "canren/red-packets",
    "description": "red packets",
    "authors": [
        {
            "name": "canren",
            "email": "sxffind@126.com"
        }
    ],
    "require": {}
}

Do you confirm generation [yes]?

步骤解释

$ composer init


  Welcome to the Composer config generator



This command will guide you through creating your composer.json config.

// 1. 输入项目命名空间
// 注意<vendor>/<name> 必须要符合 [a-z0-9_.-]+/[a-z0-9_.-]+
Package name (<vendor>/<name>) [dell/htdocs]: yourname/projectname

// 2. 项目描述
Description []: 这是一个测试

// 3. 输入作者信息,可以直接回车
Author [canren <sxffind@126.com>, n to skip]:

// 4. 输入最低稳定版本,stable, RC, beta, alpha, dev
Minimum Stability []: dev

// 5. 输入项目类型,
Package Type (e.g. library, project, metapackage, composer-plugin) []: library

// 6. 输入授权类型
License []:
> Define your dependencies.

// 7. 输入依赖信息
Would you like to define your dependencies (require) interactively [yes]?

// 如果需要依赖,则输入要安装的依赖
Search for a package: php

// 输入版本号
Enter the version constraint to require (or leave blank to use the latest version): >=5.4.0

// 如需多个,则重复以上两个步骤

// 8. 是否需要require-dev,
Would you like to define your dev dependencies (require-dev) interactively [yes]?

// 操作同上
{
    "name": "guanguans/uploadfile",
    "description": "一个通用文件上传包",
    "type": "library",
    "require": {
        "php": ">=5.4"
    },
    "require-dev": {
        "php": ">=5.4"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "guanguans",
            "email": "yzmguanguan@gmail.com"
        }
    ],
    "minimum-stability": "dev"
}

// 9. 是否生成composer.json
Do you confirm generation [yes]? yes

添加自动加载

在上一步生成的composer.json中追加:

"autoload": {
    "psr-4": {
	    "redPackets\\": "src/redPackets"
    }
}

构建项目

新建文件

新建src/redPackets/redPackets.php文件。

├─red-packets                
│  ├─src                     
│  │   ├─redPackets
│  │      ├─redPackets.php
│  └─composer.json
<?php

namespace redPackets;

use Exception;

/**
 * Created by PhpStorm.
 * User: canren
 * Date: 17-8-14
 * Time: 下午3:56
 */
class redPackets
{
    //兜底钱数,起码为1,单位是分
    public $basicsMoney = 1;

    //剩余红包个数
    public $remainSize;

    //剩余红包钱数,单位是分
    public $remainMoney;

    /**
     * 红包代码
     * redPackets constructor.
     */
    function run()
    {
        try {

            //红包总个数
            if (0 >= $this->remainSize) {
                throw new Exception('{"isError":1, "message":"红包个数应该大于0个"}');
            }

            //判断红包金额是否比红包个数大
            if ($this->remainSize > $this->remainMoney || $this->remainMoney < $this->basicsMoney * $this->remainSize) {
                throw new Exception('{"isError":1, "message":"红包金额应该比红包个数多"}');
            }

            //红包个数
            $remainSize = $this->remainSize - 1;
            //封顶红包
            $max = ($this->remainMoney - $this->basicsMoney * $this->remainSize) / $this->remainSize * 2;
            //随机取红包钱数
            $money = intval(rand(0, 100) * $max / 100);
            //随机取红包钱数+加上保底红包
            $money += $this->basicsMoney;
            $money = 0 == $remainSize ? $this->remainMoney : $money;
            //剩余钱数 (红包个数为0时 剩余钱数直接分配)
            $remainMoney = 0 == $remainSize ? 0 : $this->remainMoney - $money;

            //红包
            $result = [
                'isError' => 0,
                'info' => [
                    'remainSize' => $remainSize, //红包剩余个数
                    'remainMoney' => $remainMoney, //红包剩余钱数
                    'redPacketsMoney' => $money //当前红包个数
                ]
            ];

            return json_encode($result);

        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }

    /**
     * 初始化红包
     * @param int $basicsMoney 兜底的红包金额
     * @param int $money 红包的钱数
     * @param int $size 红包的个数
     * @param array $redPacketsMoney
     * @return array
     */
    public function redPacketsInit($basicsMoney, $money, $size, &$redPacketsMoney = [])
    {
        $redPackets = new redPackets();

        $info = $redPackets->setBasicsMoney($basicsMoney)
            ->setRemainMoney($money)
            ->setRemainSize($size)
            ->run();

        $info = json_decode($info, true);

        $redPacketsMoney[] = $info['info']['redPacketsMoney'];

        if (0 != $info['info']['remainSize']) {

            $this->redPacketsInit($basicsMoney, $info['info']['remainMoney'], $info['info']['remainSize'], $redPacketsMoney);

        }

        return $redPacketsMoney;
    }

    /**
     * 设置红包最少钱数 单位是分
     * @param $basicsMoneyMoney 最少钱数 默认为1分 大于0
     * @return $this
     */
    public function setBasicsMoney($basicsMoney)
    {
        $this->basicsMoney = $basicsMoney ? intval($basicsMoney) : $this->basicsMoney;
        return $this;
    }

    /**
     * 剩余红包个数
     * @param $remainSize 剩余红包个数
     * @return $this
     */
    public function setRemainSize($remainSize)
    {
        $this->remainSize = intval($remainSize);
        return $this;
    }

    /**
     * 剩余红包钱数
     * @param $remainSize 剩余红包钱数
     * @return $this
     */
    public function setRemainMoney($remainMoney)
    {
        $this->remainMoney = intval($remainMoney);
        return $this;
    }
}

测试

新建examples/demo.php文件。

<?php
require_once __DIR__ . '/../autoload.php';

use redPackets\redPackets;

$redPackets = new redPackets;

$redPacketsData = $redPackets->redPacketsInit(1, 200000, 200);

var_dump($redPacketsData);

完善

添加 README.md、LICENSE、.gitignore等文件,项目最终结构如下:

├─red-packets
│  ├─examples
│  │   ├─demo.php
│  ├─src
│  │   ├─redPackets
│  │      ├─redPackets.php
│  ├─.gitignore
│  ├─composer.json
│  ├─LICENSE
│  └─README.md

推送到 GitHub

将本地包推送至github。

发布

将 GitHub 上的包提交到 Packagist。
1.首先要在 Packagist 上注册账号并登录(可以用 GitHub 直接登录)。
2.点击顶部导航条中的 Summit 按钮。
3.在输入框中输入 GitHub 上的刚才包地址,如:https://github.com/canren/red-packets
4.然后点击 Check 按钮 Packagist 会去检测此仓库地址的代码是否符合 Composer 的 Package 包的要求。

检测正常的话,会出现 Submit 按钮,再点击一下 Submit 按钮,我们的包就提交到 Packagist 上了。

自动更新

上面提交上的包提交的包,当我们更新 GitHub 仓库时,Packagist 上面的的包并不会自动更新,现在我们来设置一下自动更新。

1.复制 Profile API Token 2.打开 GitHub 项目 setting,选择 Integrations & services,添加 packagist service,点击 Test service

验证是否已经自动更新:

移步 Packagist 包主页,发现已经没有了红色的圈住的提示,说明设置自动更新成功。

使用

composer require canren/red-packets

相关链接

原文地址:https://segmentfault.com/a/1190000013947602
包地址:https://github.com/canren/red-packets