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

使用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.lryc.cn/news/2399013.html

相关文章:

  • Axure设计案例——科技感渐变柱状图
  • LeetCode 热题 100 394. 字符串解码
  • 互联网大厂智能体平台体验笔记字节扣子罗盘、阿里云百炼、百度千帆 、腾讯元器、TI-ONE平台、云智能体开发平台
  • 深入解析ReactJS中JSX的底层工作原理
  • 亡羊补牢与持续改进 - SRE 的安全日志、审计与事件响应
  • NodeMediaEdge任务管理
  • LIMIT 和 OFFSET 在大数据量下的性能问题分析与优化方案
  • SpringBoot集成第三方jar的完整指南
  • 登高架设作业实操考试需要注意哪些安全细节?
  • 前端基础之《Vue(18)—路由知识点》
  • 014校园管理系统技术解析:构建智慧校园管理平台
  • 微服务各个部分的作用
  • SQLite详细解读
  • LRC and VIP
  • Python趣学篇:Pygame重现经典打砖块游戏
  • 电脑硬盘分几个区好
  • Vue3 + Element Plus + TypeScript 中 el-cascader 实现模拟用户点击功能
  • 【java】springboot注解关键字
  • supervisor 常见问题大全
  • 2024 CKA模拟系统制作 | Step-By-Step | 18、题目搭建-备份还原Etcd
  • 【Netty系列】Reactor 模式 2
  • SDL_CreateRendererWithProperties报错Parameter ‘window‘ is invalid
  • 在容器里运行go程序报错:/bin/sh: ./manager: not found
  • TomatoSCI分析日记:数据分析为什么用csv不用excel
  • HTTP协议完全指南:从请求响应到HTTPS安全机制
  • [Java 基础]Java 语言的规范
  • SpringBoot插件化架构的4种实现方案
  • 设计模式——状态设计模式(行为型)
  • CppCon 2014 学习:Lightning Talk: Writing a Python Interpreter for Fun and Profit
  • CTFHub-RCE 命令注入-过滤运算符