编辑在 composer 中管理的多个 PHP 包

Posted

技术标签:

【中文标题】编辑在 composer 中管理的多个 PHP 包【英文标题】:Editing multiple PHP Packages which are managed in composer 【发布时间】:2019-12-07 01:08:16 【问题描述】:

我使用 composer 来管理我的依赖项。 这些依赖项位于 packagist(公共)和我公司的本地作曲家存储库中,该存储库本身从公司 gitlab 实例获取其包,其中只有标签推送到包服务器。

现在我的问题。

我有一个包裹,我将其命名为 A。 包 A 依赖于 B。 我正在编辑 B 中的代码,我将其放入一个 git 分支中,该分支的设置性质仅在 gitlab 上而不是在包服务器上。 B 依赖于 C。

我还必须编辑私人图书馆 D。 D 是 C 的依赖项。

所以我在 B 和 D 中编辑代码。 我必须更改 D 中类的 psr-4 自动加载路径,并向 D 中添加一个新的命名空间。

即之前:

"autoload": 
  "psr-4": 
     "hello\\hi": "src/"
  

之后:

"autoload": 
  "psr-4": 
     "hello\\hi\\": "src/abc",
     "foor\\bar\\": "src/def",
  

当 D 的版本设置为 C 中的标记(例如 ^2.0)时,我如何让自动加载器获取新类。

通常我会在 A 中需要 D 的 dev 版本。但作曲家认为包 C 需要版本 ^2.0 中的包 D。

我目前的解决方法似乎很笨拙: 我将C中D的版本更改为dev-<branch in gitlab of D> 我将一个新分支推送到 C 的 gitlab。 在 B 中,我已将 C 的版本更改为dev-<branch in gitlab of C>。 我将一个新分支推送到 B 的 gitlab。 在 a 中,我将 B 的版本定义为 dev-<branch in gitlab of B>

但是 gitlab 分支不会被发现,因此我不得不在 A 的 repositories 部分添加 gitlab Repositories。

这必须更简单,例如,强制安装包而不考虑其他依赖项。这仅用于开发和测试目的,不用于生产。

【问题讨论】:

【参考方案1】:

首先,您这样做的事实表明您的架构存在问题。共享库应该有明确的用途,以及明确的、可独立测试的 API。因此,对包 D 的更改应定义为对该 API 的更改,并针对该定义进行测试。您可能希望对其直接依赖项进行集成测试,但使用 4 个库的链是一个不好的迹象。

然而,这是真实的世界,所以这可能不是你可以在一夜之间解决的问题。

composer.json 中的Version aliasing 允许您指定版本(例如开发分支)满足哪个版本约束。这可以通过两种不同的方式中的任何一种来指定(您不需要同时使用这两种方式):

在repo D的dev分支中,可以指定"extra":"branch-alias":"dev-foo": "2.0.x-dev"。 在repo A的dev分支中,可以指定"require":"package/D": "dev-foo as 2.0.x-dev"

或者,如果您正在积极开发这两个分支,而不仅仅是集成测试库,您可以完全绕过 Composer。如果将the preferred-install option设置为source再设置composer install,每个库都是一个完整的git克隆,可以直接切换分支编辑。您可以使用composer status 来跟踪您手动编辑的内容。如果您最终这样做,那么考虑一下如何避免将来需要它绝对是一个好主意。

【讨论】:

是的,我 100% 同意此架构存在重大问题。不幸的是,我目前无法更改它。它早在我开始使用它之前就已经构建好了,没有足够的时间和金钱来清理它。我会尝试您的建议并尽快报告。提前致谢 感谢您的帮助。第二个建议完美运行,没有任何问题。这是我一直在寻找的优雅解决方案。

以上是关于编辑在 composer 中管理的多个 PHP 包的主要内容,如果未能解决你的问题,请参考以下文章

Composer php包管理工具

怎么使用php 包依赖管理工具 composer 执行命令安装

PHP包管理

认识composer包管理工具以及搭建PHP开发框架

认识composer包管理工具以及搭建PHP开发框架

认识composer包管理工具以及搭建PHP开发框架