繁体   English   中英

composer.json 中“冲突”的用法是什么?我应该如何处理它?

[英]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) 以及相应的锁定文件package-lock.json/yarn.lockPipfile.lock ,即使所有这些锁定文件也没有这种格式服务于相同的目的(将依赖锁定到确切的版本)并以类似的方式实现(至少从表面上看)

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

Map 与这个package这个版本冲突的包,不允许和你的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

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

- - 更新 - -

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

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

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

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

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

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

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

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

Putting any other package constraint in the conflict section of such a package means: if you want to install the package in the current version, no other package version must be installed that is listed in the conflict section. 从您的示例中:如果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",

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

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

我知道这是一篇旧帖子,但我想我会在已经说过的内容上加一点:

如果您知道您的任何代码与任何包冲突,您仍然可以从 composer.json 中的冲突部分中受益。 这可能是您的代码和 package 试图做类似的工作并踩到对方的脚趾的任何原因,或者仅仅是 package 写得不好并破坏了您的代码。

在这种情况下,您可以在 composer.json 中添加一个冲突部分,以告诉作曲家永远不要下载该 package(或它的某些版本)。

如果您与其他开发人员一起工作并且其他人可能会尝试要求 package,或者如果您担心作曲家可能会尝试将其安装为另一个 package 的依赖项,例如 X 是您不想要的 package,这将很有用,但是另一个 package Y 取决于 X 而你不知道。 如果没有冲突部分,作曲家会在你不知道/注意到的情况下下载 package X。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM