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

Editing multiple PHP Packages which are managed in composer

我使用 composer 来管理我的依赖项。 这些依赖项位于 packagist (public) 和我公司的本地 composer 存储库中,它本身从公司 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 的开发版本。但是作曲家认为包 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

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

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

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

Version aliasing in composer.json 允许您指定版本(例如 dev 分支)满足的版本约束。这可以通过两种不同的方式之一指定(您不需要两者):

  • 在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 来跟踪您手动编辑的内容。如果你最终这样做了,那么考虑一下如何避免将来需要它绝对是个好主意。