当前位置: 首页 > news >正文

使用Composer创建公共类库

概述

如果多个项目中存在使用相同类库、模块的情况,此时可以考虑将类库或者模块单独抽取出来,形成独立类库,通过composer
来进行依赖管理,这样可以更方便维护,大大提升开发效率。

优势

  • 可以对特定模块进行统一维护和升级
  • 特定的类库可由专人进行维护,保证稳定性和可靠性
  • 避免了重复开发的情况

步骤

本地开发

为了方便调试,可先在本地现有项目中开发类库,等到开发完成后,再将相关代码单独抽取出来。

  • 首先在项目中创建一个存放类库的目录,如packages/zacksleo/my-libs,

其中packages是类库总目录, zacksleo是用户名,相当于命名空间的第一级,my-libs是类库存放目录。

  • 在目录中创建composer.json 文件,并添加形如以下的内容:
{"name": "zacksleo/my-libs","description": "my libs","type": "library","license": "MIT","authors": [{"name": "zacksleo","email": "zacksleo@gmail.com"}],"minimum-stability": "stable","autoload": {"psr-4": {"zacksleo\\my\\libs\\": "src"}}
}

其中,name是类库名称,descrption是详细说明,type是类别,license是使用的协议,authers是作者信息,

minimum-stability 用来声明最小依赖,通常有devstable可选,autoload中的psr-4声明了

命名空间和对应的目录,注意命名空间就当使用双反斜杠,目录使用相对路径,此外声明了目录为`src``目录

  • src目录中添加相关代码,其中的类使用命名空间zacksleo\\my\\libs

  • 在项目的composer.json中,通过path方式引入本地类库,如可在repositories中添加如下信息:

  "repositories": {"my-libs": {"type": "path","url": "packages/zacksleo/my-libs"}}

其中my-libs是别名,可任意填写,type设置成path, url为类库所在的相对路径(与composer.json文件相对)

  • 通过composer require命令或者在composer.json中的require部分添加声音,来实现依赖加载,如

composer require zacksleo/my-libs

在Github上创建库并上传代码

当在本地开发完成后,可将类库独立抽取出来(此处的my-libs目录下的内容),并提交到Github上新建的仓库中

配置packagist并发布

  1. 先在packagist.org中注册好账号,以便发布包。
  2. 在Github的仓库中,点击settings,找到 Intergrations & services, 点击Add servies, 选择Packagist,

填写在packagist.org注册的用户名和Token(在Profile中找到Your API Token)

点击确定添加,这样,每次Github的变动,都会自动更新到packagist上,免去了手动更新的麻烦

本地依赖改成线上版本, 并清除开发代码

类库一经发布到packagist上后,就可将本地项目composer.json添加的repositories移除,重新运行composer install

来安装packagist上的版本,同时packages 目录亦可删除。

版本问题说明

composer使用语义化的版本进行依赖管理,因此类库在更新和发布时,所标记的版本号,也就当遵循语义化的版本规范。

基主要有以下几个内容:

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  1. 主版本号:当你做了不兼容的 API 修改,
  2. 次版本号:当你做了向下兼容的功能性新增,
  3. 修订号:当你做了向下兼容的问题修正。
  4. 先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

参考资料

  • Composer中文文档
  • 语义化的版本规范
http://www.lqws.cn/news/87859.html

相关文章:

  • 工厂模式与多态结合
  • Rhino插件大全下载指南:解锁犀牛潜能,提升设计效率
  • llama.cpp:纯 C/C++ 实现的大语言模型推理引擎详解一
  • Spring AOP:面向切面编程 详解代理模式
  • JavaSec | SpringAOP 链学习分析
  • 【 java 集合知识 第一篇 】
  • 网络攻防技术七:计算机木马
  • git管理
  • Linux 环境下高效视频切帧的实用指南
  • ES6 Promise 状态机
  • 在linux系统上搭建git服务器(ssh协议)
  • k8s的出现解决了java并发编程胡问题了
  • sudo docker exec -it backend bash 以交互方式(interactive)进入正在运行的 Docker 容器的命令行环境
  • 【leetcode】20. 有效的括号
  • 代码训练LeetCode(19)轮转数组
  • Axure-元件流程图
  • python,shell,linux,bash概念的不同和对比联系
  • 运行shell脚本时报错/bin/bash^M: 解释器错误: 没有那个文件或目录
  • 当 “欧洲版 Cursor” 遇上安全危机
  • Python趣学篇:从零打造智能AI井字棋游戏(Python + Tkinter + Minimax算法)
  • K8S上使用helm部署 Prometheus + Grafana
  • 高考数学易错考点01 | 临阵磨枪
  • Go Gin框架深度解析:高性能Web开发实践
  • react native webview加载本地HTML,解决iOS无法加载成功问题
  • 如何轻松地将数据从 iPhone传输到iPhone 16
  • React Native图片预加载:让你的应用图片预览像德芙一样丝滑
  • vue3学习
  • dvwa7——SQL Injection
  • TypeScript中class的两种继承方式extends和implements的对比
  • Hadoop 3.x 伪分布式 8088端口无法访问问题处理