【问题标题】:How to resolve the Composer dependencies conflicts (a clean way)?如何解决 Composer 依赖冲突(一种干净的方法)?
【发布时间】:2021-07-11 04:54:49
【问题描述】:

我正在编写一个基于 Symfony v5.0.11 的 PHP 应用程序。现在我想将 Symfony 升级到^v5.2。 (Composer 版本为2.0.12。)

$ composer require symfony/framework-bundle:^5.2
./composer.json has been updated
Running composer update symfony/framework-bundle
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - symfony/framework-bundle[v5.2.0, ..., v5.2.6] require symfony/cache ^5.2 -> found symfony/cache[v5.2.0, ..., v5.2.6] but the package is fixed to v5.0.11 (lock file version) by a partia
l update and that version does not match. Make sure you list it as an argument for the update command.
    - Root composer.json requires symfony/framework-bundle ^5.2 -> satisfiable by symfony/framework-bundle[v5.2.0, ..., v5.2.6].

Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.

Installation failed, reverting ./composer.json and ./composer.lock to their original content.

没有成功,因为symfony/cache 包被锁定为composer.lock 中的v5.0.11 版本。但是当我尝试使用 --with-all-dependencies 选项时,如错误消息中所建议:

$ composer require --update-with-all-dependencies symfony/framework-bundle:^5.2
./composer.json has been updated
Running composer update symfony/framework-bundle --with-all-dependencies
Loading composer repositories with package information
Restricting packages listed in "symfony/symfony" to "5.0.*"
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - symfony/framework-bundle[v5.2.0, ..., v5.2.6] require symfony/cache ^5.2 -> found symfony/cache[v5.2.0, ..., v5.2.6] but these were not loaded, likely because it conflicts with another
 require.
    - Root composer.json requires symfony/framework-bundle ^5.2 -> satisfiable by symfony/framework-bundle[v5.2.0, ..., v5.2.6].


Installation failed, reverting ./composer.json and ./composer.lock to their original content.

现在的问题是,Composer 无法安装所需版本的软件包 symfony/cache,可能是“因为它与另一个要求冲突”。

如何干净地解决这些/这样的 Composer 问题? (“干净”在这里的意思是:不重置项目,全面运行composer update,或制作其他具有不可预测副作用的残酷东西。)


更新

  • composer.json
  • composer.lock
  • symfony.lock

composer.json

{
    "type": "project",
    "license": "proprietary",
    "require": {
        "php": "^7.3.0 || ^8.0.0",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "knplabs/knp-markdown-bundle": "^1.9",
        "paragonie/sodium_compat": "^1.15",
        "sensio/framework-extra-bundle": "^6.0",
        "sentry/sentry-symfony": "^4.0",
        "symfony/asset": "5.0.*",
        "symfony/console": "5.0.*",
        "symfony/debug-bundle": "5.0.*",
        "symfony/dotenv": "5.0.*",
        "symfony/flex": "^1.3.1",
        "symfony/framework-bundle": "5.0.*",
        "symfony/monolog-bundle": "^3.0",
        "symfony/profiler-pack": "*",
        "symfony/routing": "5.1.*",
        "symfony/twig-pack": "^1.0",
        "symfony/var-dumper": "5.0.*",
        "symfony/webpack-encore-bundle": "^1.7",
        "symfony/yaml": "5.0.*"
    },
    "require-dev": {
        "symfony/maker-bundle": "^1.30",
        "symfony/profiler-pack": "^1.0"
    },
    "config": {
        "preferred-install": {
            "*": "dist"
        },
        "sort-packages": true,
        "platform": {}
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        }
    },
    "replace": {
        "paragonie/random_compat": "2.*",
        "symfony/polyfill-ctype": "*",
        "symfony/polyfill-iconv": "*",
        "symfony/polyfill-php72": "*",
        "symfony/polyfill-php71": "*",
        "symfony/polyfill-php70": "*",
        "symfony/polyfill-php56": "*"
    },
    "scripts": {
        "auto-scripts": {
            "cache:clear": "symfony-cmd",
            "assets:install %PUBLIC_DIR%": "symfony-cmd"
        },
        "post-install-cmd": [
            "@auto-scripts"
        ],
        "post-update-cmd": [
            "@auto-scripts"
        ]
    },
    "conflict": {
        "symfony/symfony": "*"
    },
    "extra": {
        "symfony": {
            "allow-contrib": true,
            "require": "5.0.*"
        }
    }
}

composer.lock

{
    ...
        {
            "name": "symfony/framework-bundle",
            "version": "v5.0.11",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/framework-bundle.git",
                "reference": "0fc0a93f8bbe465d0b483e21b087d432baa92c16"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/0fc0a93f8bbe465d0b483e21b087d432baa92c16",
                "reference": "0fc0a93f8bbe465d0b483e21b087d432baa92c16",
                "shasum": ""
            },
            "require": {
                "ext-xml": "*",
                "php": ">=7.2.5",
                "symfony/cache": "^4.4|^5.0",
                "symfony/config": "^5.0",
                "symfony/dependency-injection": "^5.0.1",
                "symfony/error-handler": "^4.4.1|^5.0.1",
                "symfony/filesystem": "^4.4|^5.0",
                "symfony/finder": "^4.4|^5.0",
                "symfony/http-foundation": "^4.4|^5.0",
                "symfony/http-kernel": "^5.0",
                "symfony/polyfill-mbstring": "~1.0",
                "symfony/routing": "^5.0"
            },
            "conflict": {
                "doctrine/persistence": "<1.3",
                "phpdocumentor/reflection-docblock": "<3.0",
                "phpdocumentor/type-resolver": "<0.2.1",
                "phpunit/phpunit": "<5.4.3",
                "symfony/asset": "<4.4",
                "symfony/browser-kit": "<4.4",
                "symfony/console": "<4.4",
                "symfony/dom-crawler": "<4.4",
                "symfony/dotenv": "<4.4",
                "symfony/form": "<4.4",
                "symfony/http-client": "<4.4",
                "symfony/lock": "<4.4",
                "symfony/mailer": "<4.4",
                "symfony/messenger": "<4.4",
                "symfony/mime": "<4.4",
                "symfony/property-info": "<4.4",
                "symfony/serializer": "<4.4",
                "symfony/stopwatch": "<4.4",
                "symfony/translation": "<5.0",
                "symfony/twig-bridge": "<4.4",
                "symfony/twig-bundle": "<4.4",
                "symfony/validator": "<4.4",
                "symfony/web-profiler-bundle": "<4.4",
                "symfony/workflow": "<4.4"
            },
            "require-dev": {
                "doctrine/annotations": "~1.7",
                "doctrine/cache": "~1.0",
                "paragonie/sodium_compat": "^1.8",
                "phpdocumentor/reflection-docblock": "^3.0|^4.0",
                "symfony/asset": "^4.4|^5.0",
                "symfony/browser-kit": "^4.4|^5.0",
                "symfony/console": "^4.4|^5.0",
                "symfony/css-selector": "^4.4|^5.0",
                "symfony/dom-crawler": "^4.4|^5.0",
                "symfony/dotenv": "^4.4|^5.0",
                "symfony/expression-language": "^4.4|^5.0",
                "symfony/form": "^4.4|^5.0",
                "symfony/http-client": "^4.4|^5.0",
                "symfony/lock": "^4.4|^5.0",
                "symfony/mailer": "^4.4|^5.0",
                "symfony/messenger": "^4.4|^5.0",
                "symfony/mime": "^4.4|^5.0",
                "symfony/polyfill-intl-icu": "~1.0",
                "symfony/process": "^4.4|^5.0",
                "symfony/property-info": "^4.4|^5.0",
                "symfony/security-csrf": "^4.4|^5.0",
                "symfony/security-http": "^4.4|^5.0",
                "symfony/serializer": "^4.4|^5.0",
                "symfony/stopwatch": "^4.4|^5.0",
                "symfony/string": "~5.0.0",
                "symfony/translation": "^5.0",
                "symfony/twig-bundle": "^4.4|^5.0",
                "symfony/validator": "^4.4|^5.0",
                "symfony/web-link": "^4.4|^5.0",
                "symfony/workflow": "^4.4|^5.0",
                "symfony/yaml": "^4.4|^5.0",
                "twig/twig": "^2.10|^3.0"
            },
            "suggest": {
                "ext-apcu": "For best performance of the system caches",
                "symfony/console": "For using the console commands",
                "symfony/form": "For using forms",
                "symfony/property-info": "For using the property_info service",
                "symfony/serializer": "For using the serializer service",
                "symfony/validator": "For using validation",
                "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering",
                "symfony/yaml": "For using the debug:config and lint:yaml commands"
            },
            "type": "symfony-bundle",
            "extra": {
                "branch-alias": {
                    "dev-master": "5.0-dev"
                }
            },
            "autoload": {
                "psr-4": {
                    "Symfony\\Bundle\\FrameworkBundle\\": ""
                },
                "exclude-from-classmap": [
                    "/Tests/"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Fabien Potencier",
                    "email": "fabien@symfony.com"
                },
                {
                    "name": "Symfony Community",
                    "homepage": "https://symfony.com/contributors"
                }
            ],
            "description": "Symfony FrameworkBundle",
            "homepage": "https://symfony.com",
            "support": {
                "source": "https://github.com/symfony/framework-bundle/tree/v5.0.11"
            },
            "funding": [
                {
                    "url": "https://symfony.com/sponsor",
                    "type": "custom"
                },
                {
                    "url": "https://github.com/fabpot",
                    "type": "github"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
                    "type": "tidelift"
                }
            ],
            "time": "2020-07-23T08:36:09+00:00"
        },
    ...
}

symfony.lock

{
    ...
    "symfony/framework-bundle": {
        "version": "4.4",
        "recipe": {
            "repo": "github.com/symfony/recipes",
            "branch": "master",
            "version": "4.4",
            "ref": "23ecaccc551fe2f74baf613811ae529eb07762fa"
        },
        "files": [
            "config/bootstrap.php",
            "config/packages/cache.yaml",
            "config/packages/framework.yaml",
            "config/packages/test/framework.yaml",
            "config/routes/dev/framework.yaml",
            "config/services.yaml",
            "public/index.php",
            "src/Controller/.gitignore",
            "src/Kernel.php"
        ]
    },
    ...
}

【问题讨论】:

  • 您是否尝试删除供应商文件夹package.locksymfony.lock 并重新安装依赖项?
  • 请分享更多详细信息,例如您的composer.json 的当前状态。我假设那里列出了阻止更新的任何其他依赖项 - Restricting packages listed in "symfony/symfony" to "5.0.*" 听起来您正在使用 Flex?
  • @Romainbiard 我不想用这么粗暴的方法。在现实世界中,项目依赖项应该一一更新。
  • @NicoHaase 我用composer.jsoncomposer.locksymfony.lock 的内容更新了问题。

标签: php composer-php dependency-management


【解决方案1】:

考虑您的输出:

将“symfony/symfony”中列出的软件包限制为“5.0.*”

您的 composer.json 中目前有类似的内容:

"extra": {
    "symfony": {
      "require": "5.0.*"
    }
  },

这意味着您无法更新到打包大于5.0.* 的 Symfony。

但现在您正尝试在更高版本上安装 framework-bundle,但您无法更新各个组件。

“干净”地做这件事的方法是一步一步地做。

首先将您所需的 Symfony 版本更改为 5.2.*,将所有 Symfony 软件包更新到此版本(是的,需要您发出 composer update),处理更新后的任何问题(如果有),然后 然后安装您要安装的框架包。

【讨论】:

    【解决方案2】:

    您已经在composer.json 中使用多个版本的 Symfony 包,例如:

        "symfony/asset": "5.0.*",
        "symfony/console": "5.0.*",
        "symfony/debug-bundle": "5.0.*",
        "symfony/dotenv": "5.0.*",
        "symfony/framework-bundle": "5.0.*",
        "symfony/routing": "5.1.*",
        "symfony/yaml": "5.0.*"
    

    您应该清理它以避免不兼容的软件包。通过使用 Flex 或手动设置所有包版本来做到这一点


    Flex 的使用

    将所有 Symfony 相关依赖设置为"*",配置 Symfony 版本如下:

    "extra": {
      "symfony": {
        "require": "5.2.*"
      }
    },
    

    之后,通过composer update "symfony/*" 更新 Symfony 依赖项。

    以后升级到下一个版本只需要在本节中进行一次更改。


    “手动”配置

    将所有 Symfony 相关依赖设置为"5.2.*",通过composer update "symfony/*"更新它们

    【讨论】:

    • 您好 Nico,非常感谢您的回答!第二个解决方案没有奏效。原因是,有一些包,有一些嵌套的依赖(意思是“依赖的依赖”),在composer.json 中没有明确指定。但是第一个变体效果很好。谢谢!
    • 只有一个问题:更新后composer.lock 已按预期更改:所有symfony/* 软件包都有次要版本5.2。但是在symfony.lock 中,所有的包(除了symfony/string)都有5.0 的版本。 symfony.lock 需要单独更新吗?如何让它再次与composer.lock 同步?
    • 如果您想更新您的食谱,composer sync-recipes --force 可以提供帮助,但这也可能会导致新问题
    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 2019-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    相关资源
    最近更新 更多