在编写器项目中混合了通配符和静态版本号


Mixing wildcard and static version numbers in composer project

我在工作中遇到了问题,我们试图将遗留代码库拆分为较小的编写器项目,以分离代码并以受控的方式重构。

我们将代码托管在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文件中的版本要求:如果您知道您需要的新功能仅适用于软件包的新版本(兼容或不兼容),则应该显式更改版本要求。对于不兼容的更改,这是必需的-否则您将无法获得更新。对于兼容的更改,您仍然可以更改它,即使您会自动获得较新的版本,以防其他软件包可能会在以后强制降级。