我在工作中遇到问题,我们正试图将我们的遗留代码库拆分为较小的作曲家项目,以便以受控方式解耦代码和重构。
我们在bitbucket上托管我们的代码,并在"require-all": true
和我们所有的repos列出了令人满意的回购。这一直很有效。
我们遇到的问题是,当我们标记项目的新版本时,我们必须更新依赖它的所有其他项目,以指向我们刚刚标记的确切版本号。我们开始使用通配符来尝试缓解这种痛苦,然后只在我们的“核心”应用程序中设置一个特定的版本号,但是,即使我们更改为静态拥有所有版本号,我们也会收到类似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].
如果我将Project C的composer.json更改为使用1.0。*或Project B的作曲家使用1.0.4,那么这一切都适合全世界。
也许我没有按预期使用作曲家,但我认为它会看到Project B只想要1.0。* of project_a和Project C想要特定的1.0.4所以它应该继续并安装project_a 1.0 .4因为每个人都对此感到满意。
非常感谢任何帮助/建议。
答案 0 :(得分:2)
首先:坚持semantic versioning。始终评估新版本是否仅修复某些内容,添加新功能或破坏向后兼容性,并相应地对其进行标记。如果您无意中没有正确地增加版本,您应该将其视为错误,还原更改并将其作为错误修复发布。然后,您可以使用更高级别的版本增量来发布更改。
如果您正确获得语义版本,则可以更改为使用波浪号运算符指定版本。我是他们的忠实粉丝,他们在语义版本上工作得非常好。
这意味着在你的项目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
文件中的版本要求:如果您知道只需要一个新的(兼容或不兼容)版本的软件包,那么您应该明确更改版本要求。对于不兼容的更改,这是必需的 - 否则您将无法获得更新。对于兼容的更改,您可能仍会更改它,即使您自动获得更新版本,以防其他软件包可能会在以后强制降级。