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.lock
或 Pipfile.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
。我希望能够更新除此包之外的所有包,因为我暂时不想为必须应用到我的应用程序的配置更改而烦恼。
我发现 composer.json & composer.lock
(php) 有 conflict
部分(不要与合并冲突混淆)。其他类似的文件如 package.json/yarn.json
(nodejs) 或 Pipfile
(python) 和相应的 lock 文件 package-lock.json/yarn.lock
或 Pipfile.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
.
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
。我希望能够更新除此包之外的所有包,因为我暂时不想为必须应用到我的应用程序的配置更改而烦恼。