composer.json 中“冲突”的用法是什么,我该怎么办?

问题描述

我发现 composer.json & composer.lock(PHP) 有 conflict 部分(不要与合并冲突混淆)。其他类似的文件package.json/yarn.json (nodejs) 或 Pipfile (python) 以及相应的 lock 文件 package-lock.json/yarn.lockPipfile.lock,没有这样的即使所有这些锁定文件都用于相同的目的(锁定对现有版本的依赖)并以类似的方式实现(至少从表面上看)

那么它的用途是什么,我应该用它做什么?我阅读了 Composer 文档 https://getcomposer.org/doc/04-schema.md#conflict 但我仍然感到困惑,例如

与此包的此版本冲突的包的映射。不允许将它们与您的软件包一起安装。

例如在运行 composer install我有一个 composer.lock 说

    {
        "name": "symfony/http-kernel","version": "v4.4.20",...
        "conflict": {
            "symfony/browser-kit": "<4.3","symfony/config": "<3.4","symfony/console": ">=5","symfony/dependency-injection": "<4.3","symfony/translation": "<4.2","twig/twig": "<1.43|<2.13,>=2"
        },...

很容易猜测“symfony/console”5.0 与“symfony/http-kernel”4.4.20 冲突,因此不会安装 symfony/console 5.0

我需要对冲突做些什么吗?到目前为止,我觉得作为包用户(而不是包开发者),这些信息仅供参考,我不需要做任何事情。但是为什么要为我列出它们呢?毕竟package.json和Pipefile没有这些信息,没有它我也找不到问题。

---更新---

从我得到的答案中我意识到我需要强调这一点:我知道 composer.lock 是为作曲家准备的,所以我不需要担心。

我不明白的是将它放在 composer.json 中的目的,这个文件是供人类用户使用的。因此,如果它有冲突部分,我该怎么办?

解决方法

"conflict": {
    "symfony/console": ">=5",

这意味着由于某种原因,您的软件包无法与 symfony/console 版本 5 及更高版本一起使用,因此它将保持在 5 以下。

例如您可以排除一些包错误版本:

"conflict": {
    "foo/bar": "1.420.69",} 
,

如果我不是软件包开发人员而是软件包用户,我想知道我的 composer.json 中“冲突”部分的实际用例。

在构建应用程序时,与构建可重用库(如您在问题中提到的 symfony/http-kernel)相比,您可以更好地自由选择依赖项。

在此类包的 conflict 部分放置任何其他包约束意味着:如果您想安装当前版本的包,则必须安装冲突部分中列出的其他包版本。根据您的示例:如果 symfony/http-kernel 安装在任何版本 symfony/browser-kit 中,则不得安装 v4.4.20 中的 <4.3

在您自己的应用程序中,您可以更自由地对所使用的包使用更严格的约束。您可以要求所有软件包都具有非常严格的版本号,但这会降低更新的舒适度。例如,这是我当前项目之一中 require 部分的一部分:

        "doctrine/annotations": "^1.0","doctrine/doctrine-bundle": "^2.2","doctrine/doctrine-migrations-bundle": "^3.0","doctrine/orm": "^2.7","easycorp/easyadmin-bundle": "^3.1","exercise/htmlpurifier-bundle": "^3.1","knplabs/knp-snappy-bundle": "^1.8","league/csv": "^9.6","lexik/jwt-authentication-bundle": "^2.10","nelmio/cors-bundle": "^2.1",

所有这些包可能会安装大量我无法控制的其他依赖项。但是,如果我知道其他依赖项的任何版本会导致问题,我可以在我的应用程序的 conflict 部分中列出它们,以便不安装此版本。

例如,过去我需要它来更新 doctrine/migrations 的配置,其中配置已更改。我希望能够更新除这个包之外的所有包,因为我不想在一段时间内为我必须应用到我的应用程序的配置更改而烦恼。