引出
在实际使用中经常会有这样的需求, 多个PHP项目中用到了同一套代码, 如果靠复制粘贴的话, 不光代码不好维护, 而且同步起来也麻烦.
但是可以用 PHP 的包管理呀, composer. 那新的问题来了, 我们自己私人的包, 并不想开源出去, 怎么办呢?
来了, 利用gitlab
github
gitee
等管理自己的私有 composer 包. 这三个都是 git 管理工具, 使用起来都是一模一样的流程, 我就以访问速度比较快的gitee
来举例.
发布 composer 包
首先创建一个项目, 然后在src
路径下放自己的源代码, 当然其他路径或者跟路径都可以. 然后在项目的跟路径下新建composer.json
文件(请自行将下面的注释去掉):
{
// 包的名字, 在之后其他项目引入`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
:
<?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
文件中简单调用了一下测试的方法(当然, 在真实的项目中也可以这样搞, 毕竟你的包写完也是需要测试的嘛):
<?php
require_once __DIR__.'/../vendor/autoload.php';
hujingnbMyUtil::echoTest();
echo PHP_EOL;
运行一下, 一切正常, 把项目提交上去, 因为是私人用嘛, 提一个私有项目就好啦. 之后这个包作为一个单独的项目进行维护就好了.
在项目中引入私有包
另外建一个项目, 用来测试引入私有包. composer.json
如下(请自行删除注释):
{
"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 管理工具统一管理啦.