对于ZendFramework组件存储库,我们偶尔需要将更改反向移植到2.4LTS版本。这需要检查基于最后一个LTS标记的分支,应用补丁(通常通过编辑将PHP5.5语法转换为PHP5.3),并针对PHP5.3和5.4运行测试。
当然,要运行测试,您需要安装正确的依赖项集。如果您有任何组件依赖项,这意味着运行composerupdate
以确保您获得这些组件的2.4版本组件。
这就是我的故事开始的地方。
不正确的依赖
昨天我在使用我们的一个组件zend-validator时遇到了这种情况。该组件依赖于zend-uri,不幸的是,它也依赖于zend-validator。通常这不是问题,因为组件已在任何其他ZF组件上指定版本self.version
。
问题发生在我在作曲家不知道的分支中时。在那种情况下,Composer不知道需要什么版本,并假定是最新的。对于ZF组件,它想使用2.5.x@dev
,但不能,因为我是PHP5.3。然后它回退到2.4版本,但找不到与发布分支名称直接匹配的版本(在本例中为dev-release-2.4.
)。
修复依赖关系
我第一次尝试修复是更改zend-validator依赖项。起初,我尝试了^2.4.0
,但这与说>=2.4.0,<3.0.0
是一样的——给我留下了同样的问题Composer更喜欢2.5版本。
然后我将其更改为~2.4.0
,但问题随后变成了依赖项的问题,这些依赖项仍在指定self.version
,并且无法解析为已知版本。
强制版本
幸运的是,我在Composer故障排除页面上找到了一个解决方案。该技巧专门针对Travis-CI,但在本地同样适用。本质上,您强制Composer将包报告为特定版本。
在我的例子中,我做了以下事情:
$ COMPOSER_ROOT_VERSION=2.4.7 composer install
瞧!使用self.version
的任何依赖项现在都解析为2.4.8,并且我的根包语义版本说明符(~2.4.0
)得到了适当的尊重。