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

Qiu*_*ang 11 php composer-php package.json yarnpkg pipfile

我发现composer.json & composer.lock(php) hasconflict 部分(不要与合并冲突混淆)。其他类似的文件,如package.json/yarn.json(nodejs) 或Pipfile(python) 以及相应的锁定文件package-lock.json/yarn.lockPipfile.lock,不具有这种格式,即使所有这些锁定文件都具有相同的目的(将依赖项锁定到确切的版本)并以类似的方式实现(至少从表面上看)

那么它的用途是什么以及我应该用它做什么?我阅读了作曲家文档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"
        },
    ...
Run Code Online (Sandbox Code Playgroud)

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

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

- - 更新 - -

从我得到的答案中,我意识到我需要强调这一点:我理解composer.lock是针对composer的,所以我不需要担心它。

我不明白将其放入composer.json的目的,该文件是供人类用户使用的。那么如果它有冲突部分我该怎么办呢?

Nic*_*ase 9

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

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

将任何其他包约束放在conflict此类包的部分中意味着:如果要在当前版本中安装该包,则必须安装冲突部分中列出的其他包版本。从您的示例来看:如果在任何版本中安装,symfony/http-kernel则不得在 v4.4.20 中安装。symfony/browser-kit<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",
Run Code Online (Sandbox Code Playgroud)

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

例如,过去我需要它来更新doctrine/migrations配置已更改的位置。我希望能够更新除这个包之外的所有包,因为我不想打扰我必须暂时应用于我的应用程序的配置更改。


Jus*_*nas 7

"conflict": {
    "symfony/console": ">=5",
Run Code Online (Sandbox Code Playgroud)

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

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

"conflict": {
    "foo/bar": "1.420.69",
} 
Run Code Online (Sandbox Code Playgroud)