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