prinsfrank / composer-version-lock
由 composer 自身提供功能;将 composer 锁定到特定版本的项目中
Requires
- php: >=7.2
- composer-plugin-api: ^1.0 || ^2.0
- composer/semver: ^1.0 || ^2.0 || ^3.0
Requires (Dev)
- ext-json: *
- composer/composer: ^1.0 || ^2.0
- phpunit/phpunit: ^6.0 || ^7.0 || ^8.0 || ^9.4
README
警告
由于此软件包提供的功能现在已完全由 composer 本身提供(感谢 @szepeviktor!),因此此软件包现已弃用。要迁移,请执行以下命令。
如文档中所述,添加对插件 api 的要求是个好主意,因为在 2.2.0 版本之前,无法提供确切的 composer 版本。
composer require "composer-plugin-api:>=2.2.0"
现在您可以添加对实际 composer 版本的要求
composer require "composer:^2.3.9"
最后,您可以删除此软件包!
composer remove prinsfrank/composer-version-lock执行此命令后,"composer-version" 和 "composer-suggest" 键应自动从您的 composer.json 中的 "extra" 部分删除。如果没有其他键,则应删除整个部分。如果不是这样,请手动删除这些键。
Composer 版本锁定
为什么需要这个插件?
当与同一代码库中的许多人一起工作时,解决 Composer 锁定文件的合并冲突有时相当麻烦。
即使分支之间唯一的更改是添加了两个不同的软件包,对 composer.lock
文件的 diff 也可能长达数百行。当唯一预期的更改是哈希值和软件包的信息(以及可能的一些更改的依赖项版本)时,开发人员之间的 composer 版本差异通常是罪魁祸首。有时这些差异很大,比如 支持资金部分,其他时候只是某些键的顺序从 composer 版本更改为下一个。
此插件使得在 composer.json
文件中共享所需的 composer 版本成为可能。
更多详情请查看我的个人博客上的文章
开始使用
要包含此软件包,只需运行;
composer require prinsfrank/composer-version-lock
要为您的项目设置所需的 composer 版本,请运行;
composer config extra.composer-version {VERSION_CONSTRAINT}
任何 Composer 约束 都可以作为 composer/semver
软件包使用,以确定当前 composer 版本是否满足版本约束。
要获取您的当前版本,请运行 composer --version
。
注意:当未设置 composer 版本时,将显示错误,并提供强制执行您当前 composer 版本的说明。
工作原理
更改锁定文件的命令
一些 composer 命令会更改 composer.lock
- update
- remove
- require
当开发人员使用不满足版本约束的 composer 版本执行上述任何命令时,他们将收到以下错误,并且命令会中止
注意:当版本约束不是精确版本或下一个重要操作符时,无法推断出匹配的版本,因此会显示
composer self-update {version}
。
不会更改锁文件的命令
当开发者执行任何其他命令而没有可满足的版本时,他们只会收到警告,Composer 会继续运行
使用正确版本时的信息
当开发者使用满足约束的 Composer 版本时,将显示以下消息
选项
建议版本
当使用具有多个有效版本的版本约束时,您可能想建议特定版本。例如,当使用版本约束 1.10.14 || 1.10.15
时,此插件不知道建议哪个版本,因为它们都是有效版本。当您特别想建议 1.10.15
时,您可以通过以下命令使用 composer-suggest
额外键来设置
composer config extra.composer-suggest {VERSION}
当设置了建议版本,但它根据版本约束不正确时,您将收到控制台错误,并且插件将阻止任何进一步的操作,直到您解决此问题。您必须设置正确的建议版本或删除建议版本。
版本更新策略
实施“宽限期”
当您有一个锁定到特定 Composer 版本(例如 2.0.5
)的主/主分支,并且有一些最近从主分支分叉出来的功能分支时,您可能会遇到在主分支和功能分支之间切换时需要每次都切换 Composer 版本的问题。
这里的一个好策略是使用以下“宽限期”
- 初始版本约束是
2.0.5
- 将旧版和新版分别通过两个竖线字符分隔作为新的版本约束:
2.0.5 || 2.0.6
。 - 过了一段时间,旧版和新版的版本约束应该存在于所有分支中。现在您可以要求新版本
2.0.6
当使用命令
composer remove prinsfrank/composer-version-lock
删除插件时,composer.json 中的extra
部分的composer-version
和composer-suggest
设置也会清理。当剩余的额外部分为空时,它也会被删除。
Composer 版本之间锁文件更改的示例
- 在 https://getcomposer.org.cn/doc/01-basic-usage.md#composer-lock-the-lock-file 和 https://getcomposer.org.cn/doc/01-basic-usage.md#installing-dependencies 之间,readme 部分的 URL 发生了变化
- “hash”部分被重命名为“content-hash”或相反。
- 即使 composer.lock 的其余部分没有变化,“hash”或“content-hash”也会被重新计算。
- “support”部分会随着单个包的添加或删除而添加或删除。
- "时间"部分现在已为每个包添加或删除了"T"和时区偏移,以表示本地化时间戳。
- 已为每个包添加或删除了"资金"部分。
- 已添加或删除了"plugin-api-version"部分。
- 等等...
开发
如果您想改进此插件并创建PR,我们非常欢迎!
为了在本地开发时启用自动完成,运行composer u
以切换到最新的composer/composer版本,并使用composer u --prefer-lowest
以切换到第一个composer/composer版本。
要实际测试该包,运行composer self-update {VERSION}
以切换到系统使用的composer版本。
可以使用composer test
或vendor/bin/phpunit
运行测试,并且每当推送或PR到master时,都会自动运行针对每个稳定的composer版本和每个PHP版本的测试。