私有 composer 包创建
引出
在实际使用中经常会有这样的需求, 多个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 当然是少不了的.
现在我的项目结构如下:
这个时候先别急着提交, 可以先测试一下. 直接在跟路径下执行composer install
. 执行之后, 你就会发现跟路径多了一个 vendor 包, 写个 test 测试一下. 现在的结构如下:
Test.php
文件中简单调用了一下测试的方法(当然, 在真实的项目中也可以这样搞, 毕竟你的包写完也是需要测试的嘛):
<?php
require_once __DIR__.'/../vendor/autoload.php';
\hujingnb\MyUtil::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 链接哪里有, 这里:
好了, 执行 composer install
命令安装吧. 因为使用了 http 请求, 中间会要求输入用户名和密码, 直接输入就行. 安装之后就是这样了:
看vendor 的结构, 它其实就是直接将上面的项目 clone 进来了.
现在试验一下更新功能, 将第一个项目进行更新点并提交, 本项目中执行composer update
或者 composer update hujingnb/composer_demo
只更新这一个包. 查看后确实更到了最新, 嗯嗯没得问题.
好, 是不是很简单呀.
最后的最后, 有没有发现点什么? 第二个项目的composer.json
文件和第一个项目基本没什么区别嘛, 而且在 require 的时候, 使用的是"name"属性, 在第二个项目中也有"name", 那是不是意味着, 第二个项目也可以作为包被导入啊? 我试了一下, 确实可以. 所以, 每一个composer
项目, 既引入了其他项目, 同时也可以被其他项目引入. 嗯嗯, 666.
以后就可以告别代码的复制粘贴, 将私有包通过git 管理工具统一管理啦.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY