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

编辑在composer中管理的多个PHP包,php,git,composer-php,gitlab,semantic-versioning,Php,Git,Composer Php,Gitlab,Semantic Versioning,我使用composer来管理我的依赖项。 这些依赖项位于PackageGist(public)和my companies local composer存储库中,该存储库本身从companies gitlab实例获取其包,其中只有标签被推送到包服务器 现在来谈谈我的问题 我有一个包裹,我叫它a。 包A依赖于B。 我正在编辑B中的代码,我将其放在git分支中,根据设置的性质,它只在gitlab上,而不在包服务器上。 B依赖于C 我还必须编辑一个私人图书馆D。 D是C的依赖项 所以我在编辑B和D中的代

我使用composer来管理我的依赖项。 这些依赖项位于PackageGist(public)和my companies local composer存储库中,该存储库本身从companies 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的开发版本。但composer认为C包需要^2.0版本中的D包

我目前的解决办法似乎很笨拙: 我将C中D的版本更改为
dev-
我把一个新分支推到了C的gitlab。 在B中,我将C的版本更改为
dev-
。 我把一个新分支推到了B的gitlab。 在a中,我将B的版本定义为
dev-

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

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

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

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

composer.json
中,您可以指定一个版本(如开发分支)满足哪些版本约束。这可以通过两种不同的方式之一指定(您不需要两种方式都指定):

  • 在repo D的dev分支中,可以指定
    {“extra”:{“分支别名”:{“dev foo”:“2.0.x-dev”}}}
  • 在repoa的dev分支中,您可以指定
    {“require”:{“package/D”:“devfooas2.0.x-dev”}

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

是的,我100%同意此体系结构存在一个重大问题。不幸的是,我现在无法改变它。在我开始使用它之前,它已经被构建了很久,而且没有足够的时间和金钱来清理它。我会尝试你的建议并尽快报告。提前谢谢你的帮助。第二个建议非常有效,没有任何问题。这是我一直在寻找的优雅解决方案。