私有 composer 包创建

2020-06-28 11:30:49 浏览数 (1)

引出

在实际使用中经常会有这样的需求, 多个PHP项目中用到了同一套代码, 如果靠复制粘贴的话, 不光代码不好维护, 而且同步起来也麻烦.

但是可以用 PHP 的包管理呀, composer. 那新的问题来了, 我们自己私人的包, 并不想开源出去, 怎么办呢?

来了, 利用gitlab github gitee 等管理自己的私有 composer 包. 这三个都是 git 管理工具, 使用起来都是一模一样的流程, 我就以访问速度比较快的gitee来举例.

发布 composer 包

首先创建一个项目, 然后在src路径下放自己的源代码, 当然其他路径或者跟路径都可以. 然后在项目的跟路径下新建composer.json文件(请自行将下面的注释去掉):

代码语言:javascript复制
{
   // 包的名字, 在之后其他项目引入`require`的时候,用的就是这个
    "name": "hujingnb/composer_demo",
   // 包的描述信息
    "description": "composer test",
   // 包类型, 这里指定为 库
    "type": "library",
   // 作者信息, 可以有多个, 没有也行
    "authors": [
        {
            "name": "hujingnb",
            "email": "hujingnb@qq.com"
        }
    ],
   // 在这里如果用到了其他的包, 也可以引进来
    "require": {},
   // 设置自动加载机制
    "autoload": {
        "psr-4": {
            "hujingnb\": "src/"
        }
    }
}

当然, 如果嫌麻烦, 可以在跟路径下直接运行composer init 跟着它的提示将信息填进去就行了.

然后我在src路径下创建了一个测试文件MyUtil.php:

代码语言:javascript复制
<?php
/**
 * 测试, 随便写两个
 * @author hujing
 * @date 2020/6/18
 */
// 这里的命名空间要和 composer 中定义的自动加载机制相对应
namespace hujingnb;

class MyUtil{
    public static function echoTest(){
        echo 'test';
    }
}

当然, 因为要提交git嘛, gitignore 当然是少不了的.

现在我的项目结构如下:

image-20200618211736985

这个时候先别急着提交, 可以先测试一下. 直接在跟路径下执行composer install . 执行之后, 你就会发现跟路径多了一个 vendor 包, 写个 test 测试一下. 现在的结构如下:

image-20200618212403956

Test.php 文件中简单调用了一下测试的方法(当然, 在真实的项目中也可以这样搞, 毕竟你的包写完也是需要测试的嘛):

代码语言:javascript复制
<?php

require_once __DIR__.'/../vendor/autoload.php';

hujingnbMyUtil::echoTest();
echo PHP_EOL;

运行一下, 一切正常, 把项目提交上去, 因为是私人用嘛, 提一个私有项目就好啦. 之后这个包作为一个单独的项目进行维护就好了.

在项目中引入私有包

另外建一个项目, 用来测试引入私有包. composer.json 如下(请自行删除注释):

代码语言:javascript复制
{
    "name": "root/composer_require_demo",
    "authors": [
        {
            "name": "hujingnb",
            "email": "hujingnb@qq.com"
        }
    ],
    "require": {
       // 指定引入的包名称, 这个名称就是上面包的 "name"属性, 后边指定引入 master 分之
        "hujingnb/composer_demo": "dev-master"
    },
    "repositories": [
       // 将包源换成阿里云的, 速度快一些
        {
            "type": "composer",
            "url": "https://mirrors.aliyun.com/composer/"
        },
       // 禁用官方请求, 否则慢的要死, 甚至超时
        {
            "packagist": false
        },
       // 将自己的项目 git 连接放进来
        {
            "type": "git",
            "url": "https://gitee.com/hujingnb/composer_demo.git"
        }
    ],
    "config": {
       // 开启 http 请求, 当然, 如果上面的 git 使用的是 ssh 的话, 这里可以不加. 不过需要配置 ssh, 请自行谷歌
        "secure-http": false
    }
}

git 链接哪里有, 这里:

image-20200618213127407

好了, 执行 composer install 命令安装吧. 因为使用了 http 请求, 中间会要求输入用户名和密码, 直接输入就行. 安装之后就是这样了:

image-20200618213249687

看vendor 的结构, 它其实就是直接将上面的项目 clone 进来了.

现在试验一下更新功能, 将第一个项目进行更新点并提交, 本项目中执行composer update 或者 composer update hujingnb/composer_demo 只更新这一个包. 查看后确实更到了最新, 嗯嗯没得问题.

好, 是不是很简单呀.


最后的最后, 有没有发现点什么? 第二个项目的composer.json文件和第一个项目基本没什么区别嘛, 而且在 require 的时候, 使用的是"name"属性, 在第二个项目中也有"name", 那是不是意味着, 第二个项目也可以作为包被导入啊? 我试了一下, 确实可以. 所以, 每一个composer项目, 既引入了其他项目, 同时也可以被其他项目引入. 嗯嗯, 666.

以后就可以告别代码的复制粘贴, 将私有包通过git 管理工具统一管理啦.

0 人点赞