我在工作中遇到了问题,我们试图将遗留代码库拆分为较小的编写器项目,以分离代码并以受控的方式重构。
我们将代码托管在bitbucket上,并与"require-all": true
和我们列出的所有repos有一个满意的repo。
我们遇到的问题是,当我们要标记项目的新版本时,我们必须更新所有依赖于它的其他项目,以指向我们刚刚标记的确切版本号。我们开始使用通配符来尝试减轻这种痛苦,然后在我们的"核心"应用程序中设置一个特定的版本号,然而,我们得到像could not be found in any version
这样的错误,即使我们改变回所有的版本号静态设置相同,它工作得很好。
Project A composer.json
...
"require": {
"doctrine/dbal": "2.4"
}
...
Project B composer.json
...
"require": {
"acmeco/project_a": "1.0.*"
},
...
Project C composer.json
...
"minimum-stability": "stable",
"require": {
"acmeco/project_a": "1.0.4"
"acmeco/project_b": "1.0.9"
}
...
当运行composer update
时,我们得到以下结果:
Your requirements could not be resolved to an installable set of packages.
Problem 1
- The requested package acmeco/project_a could not be found in any version, there may be a typo in the package name.
Problem 2
- acmeco/project_b 1.0.9 requires acmeco/project_a 1.0.4 -> no matching package found.
- acmeco/project_b 1.0.9 requires acmeco/project_a 1.0.* -> no matching package found.
- Installation request for acmeco/project_b 1.0.9 -> satisfiable by acmeco/project_b[1.0.9].
如果我改变项目C的编写器。Json使用1.0。*或项目B的作曲家使用1.0.4,一切都是正确的世界。
也许我没有按预期使用composer,但我认为它会看到项目B只想要1.0。project_a和Project C的*需要特定的1.0.4,所以应该继续安装project_a 1.0.4,因为每个人都很满意。
首先:坚持语义版本控制。总是评估新版本是否只修复了一些东西,增加了一个新功能或破坏了向后兼容性,并相应地标记它。如果您无意中没有正确地增加版本,则应该将其视为错误,恢复更改并将其作为错误修复发布。然后,您可以使用更高级别的版本增量发布更改。
如果语义版本正确,则可以使用波浪号操作符指定版本。我是它们的超级粉丝,它们在语义版本中工作得特别好。
这意味着在你的项目C中你将
"require": {
"acmeco/project_a": "~1.0",
"acmeco/project_b": "~1.0"
}
项目B:
"require": {
"acmeco/project_a": "~1.0"
}
在项目A中(取决于"doctrine/dbal"是否承诺实现语义版本-如果不是:2.4.*
):
"require": {
"doctrine/dbal": "~2.4"
}
然后你应该解释为什么项目C直接依赖于项目a。它可能完全有可能,但如果项目C中的代码使用了项目a的类,那么项目B也应该受到质疑。然而,更有可能的是,项目C不应该直接依赖于包a,而唯一的依赖是在包b中。
但另一方面,通过允许每个包要求任何承诺兼容的版本,但可能包含错误修复和新功能,您给Composer提供了所需的空闲时间来获得正确的版本要求。
为了更好地可视化版本依赖关系,我强烈建议您使用graph-composer。这将显示包中包含哪些版本需求。
你认为有必要指出C包中的确切版本吗?Composer已经记录了你在更新时获取的确切版本,并且在安装时总是安装那个确切的版本(你必须提交composer.lock
文件)。
只需要更改composer.json
文件中的版本要求:如果您知道您需要的新功能仅适用于软件包的新版本(兼容或不兼容),则应该显式更改版本要求。对于不兼容的更改,这是必需的-否则您将无法获得更新。对于兼容的更改,您仍然可以更改它,即使您会自动获得较新的版本,以防其他软件包可能会在以后强制降级。