使用 splitsh-lite 将 PHP 单体仓库发布到 Packagist

发布日期:2026-03-23 10:04:18   浏览量 :0
发布日期:2026-03-23 10:04:18  
0

你好!

系列背景: 这是瓦西娅系列的第10部分。此前的文章涵盖了实体系统访问控制API层DBAL迁移国际化(i18n)测试部署以及人工智能包

一个无法被安装的框架并不是真正的框架,而只是一个演示。本文将介绍瓦西娅如何从一个所有子包都依赖于@dev路径仓库的单一代码库(monorepo),转变为在Packagist上各自独立版本化的软件包。

“直接发布就行”有什么问题?

瓦西娅是一个单一代码库。根目录下的composer.json文件在packages/目录下定义了43个子包,每个子包都被引用为带有@dev约束的路径仓库。在开发过程中,这种方式非常方便。Composer会在本地解析所有依赖,你完全不需要考虑版本管理的问题。

但当你尝试将根包注册到Packagist时,问题就暴露出来了。Packagist无法解析路径仓库。每个子包的require块中类似"waaseyaa/entity": "@dev"的声明都指向一个本地目录,而这个目录在Packagist注册表中并不存在。如果不先发布所有子包,根包根本无法被发布。

这并非一个简单的元数据修复问题,而是关于单一代码库与其使用者之间关系的一项架构决策。

四种策略,一个胜出者

在编写任何代码之前,我们考虑了四种方案。

策略 首次安装所需时间 维护成本 使用者体验
拆分为独立仓库 数周 高 —— 需要维护43个仓库 干净清晰,但开发过程痛苦
单一代码库 + splitsh-lite 数天 低 —— 在打标签时自动拆分 安装体验干净,同时保留单一代码库开发模式
私有Satis注册表 数天 中等 —— 需要自托管注册表 需要Satis基础设施支持
Composer元包 数小时 一次性安装全部内容,缺乏细粒度控制

splitsh-lite最终胜出,因为它既保留了单一代码库作为唯一真实来源,又满足了Packagist的要求:每个软件包拥有独立的仓库,各自包含自己的composer.json文件和带标签的发布版本。

开发者的工作流程不会改变。你仍然在单一代码库中工作,仍然从根目录运行测试。代码拆分只是发布阶段的问题,而非开发阶段的问题。

splitsh-lite 的工作原理

splitsh-lite会读取你 Git 历史中的某个子目录,并生成一个新的提交树,其中仅包含该目录的内容。

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部