编辑在 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 允许您指定版本(例如开发分支)满足哪个版本约束。这可以通过两种不同的方式中的任何一种来指定(您不需要同时使用这两种方式):
"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 包的主要内容,如果未能解决你的问题,请参考以下文章