php - composer.json 中“冲突”的用法是什么,我该怎么办?
问题描述
我发现composer.json & composer.lock
(php) hasconflict
部分(不要与合并冲突混淆)。其他类似的文件,如package.json/yarn.json
(nodejs) 或Pipfile
(python) 以及相应的锁定文件package-lock.json/yarn.lock
或Pipfile.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"
},
...
很容易猜到 "symfony/console" 5.0 与 "symfony/http-kernel" 4.4.20 冲突,所以symfony/console 5.0
不会安装。
我需要对冲突做些什么吗?到目前为止,作为包用户(而不是包开发人员),我觉得这些信息只是仅供参考,我不需要做任何事情。但是,为什么还要麻烦为我列出它们呢?毕竟 package.json 和 Pipefile 没有这样的信息,没有它我也找不到问题。
- - 更新 - -
从我得到的答案中,我意识到我需要强调这一点:我理解composer.lock是为作曲家设计的,所以我不需要担心。
我不明白的是把它放在composer.json的目的,这个文件是供人类用户使用的。那么,如果它有一个冲突部分,我该怎么办呢?
解决方案
如果我不是包开发人员而是包用户,我想知道 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",
所有这些软件包都可能安装大量我无法控制的其他依赖项。但是,如果我知道其他依赖项的任何版本都会导致问题,我可以在conflict
我的应用程序部分列出它们,以便不安装此版本。
例如,过去我需要它来更新doctrine/migrations
配置更改的位置。我希望能够更新除此之外的所有包,因为我不想为我必须在一段时间内应用于我的应用程序的配置更改而烦恼。