Version: 6000.3
语言: 中文
包依赖关系和解析
嵌入式依赖项

包版本冲突和解决方法

当您将包添加到项目清单每个 Unity 项目都有一个项目清单,用作包管理器的入口点。此文件必须在<project>/Packages目录。包管理器使用它来配置许多内容,包括该项目的依赖项列表,以及要查询包的任何包存储库。更多信息
请参阅术语表
,Unity 将该包视为项目的依赖项(直接依赖项)。但是,包也可以依赖于其他包,这些包会创建间接依赖关系当项目请求一个包本身“依赖”另一个包时,就会出现间或传递依赖关系。例如,如果您的项目依赖于alembic@1.0.7包,而包又取决于timeline@1.0.0package,则您的项目直接依赖于 Alembic,间接依赖于 Timeline。更多信息
请参阅术语表
在任何需要该包的项目中。

由于大多数项目需要多个包才能开发游戏和应用,因此包管理器必须评估要从注册表中检索的所有请求包版本(无论是直接还是间接),并决定在这些包版本中安装哪个版本。为此,它计算满足项目中所有直接和间接依赖项的包集,从项目依赖项开始,递归地探索每个间接依赖项,收集所有依赖项信息,然后选择一组满足依赖项要求而没有任何冲突的包。例如,此依赖项图表示一个包含四个的项目直接依赖关系当项目“请求”特定包版本时,就会发生直接依赖项。若要创建直接依赖项,请将该包和版本添加到项目清单中的 dependencies 属性(以package_name@package_version). 更多信息
请参阅术语表
以及它们的所有间接依赖关系:

项目的直接和间接包依赖关系图
项目的直接和间接包依赖关系图

在此示例中:

  • 浅蓝色节点表示项目的直接依赖项。
  • 深蓝色节点显示与此项目中的间接依赖项相同的包和版本。
  • 红色节点显示同一包的两个不同版本,这是冲突。

注意:只需要解析使用 versions 声明的包依赖项。包管理器选择从其他来源安装的包,例如嵌入式包嵌入式包是存储在Packages目录。这与从包服务器下载的大多数包不同,并且是不可变的。更多信息
请参阅术语表
,以及使用本地路径Git URL 和基于版本的依赖项上的内置包声明的依赖项。

选择最佳解决方案

根据项目清单中定义的包集,评估所有可能的包组合可能需要很长时间:一个项目可能依赖于数百个包,每个包都依赖于数百个其他包,大多数包需要不同的版本。

锁定文件和分辨率策略

为了提供最有效的解决方案,包管理器通过在锁定文件中跟踪以前使用的包版本来确定它们的优先级。这保证了使用相同输入的后续依赖项解析产生相同的输出。它还最大限度地减少了耗时的作,例如下载、提取或复制包。

有时,包管理器找不到仅包含锁定包的解决方案。在这种情况下,包管理器使用风险最小的升级解决方案,默认情况下,首选补丁升级而不是次要升级或主要升级,并且优先于次要升级而不是主要升级。但是,在考虑使用 resolutionStrategy 属性的更高版本时,可以自定义包管理器的积极程度。

在此示例中,请求的以下包有多个版本:

  • burst@1.2.2(两次)和burst@1.3.0-preview.3
  • collections@0.5.1-preview.11collections@0.5.2-preview.8
  • jobs@0.2.4-preview.11(两次)和jobs@0.2.5-preview.20

使用直接和间接依赖项集,包管理器选择突发包的最高版本(burst@1.3.0-preview.3),满足collections@0.5.2-preview.8包的依赖项:

在依赖关系图中,蓝色节点指示包管理器选择了哪些版本
在依赖关系图中,蓝色节点指示包管理器选择了哪些版本
包依赖关系和解析
嵌入式依赖项