composer.json 中 "conflict" 的用法是什么?我应该用它做什么?

What is usage of "conflict" in composer.json and what should I do with it?

我发现 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 但我仍然感到困惑,例如

Map of packages that conflict with this version of this package. They will not be allowed to be installed together with your package.

例如在运行 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不会安装。

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

---更新---

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

我不明白的是把它放在composer.json里的目​​的,这个文件是给人类用户的。那么,如果它有冲突部分,我该怎么办?

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

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

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

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

I want to know a practical use case of "conflict" section in my composer.json if I am not a package developer but a package user.

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

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

中,则不得安装 v4.4.20 中的 symfony/http-kernel

在您自己的应用程序中,您可以更自由地对您使用的包使用更严格的约束。您 可以 要求所有包具有非常严格的版本号,但这会使更新变得不那么舒服。例如,这是我当前项目之一的 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",

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

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