版本:Unity 6 (6000.0)
语言:英语
作用域注册表
锁定文件

版本解析与冲突

当您将包添加到项目清单每个 Unity 项目都有一个项目清单,它充当包管理器的入口点。此文件必须位于<project>/Packages目录中。包管理器使用它来配置许多内容,包括该项目的依赖项列表以及要查询包的任何包存储库。 更多信息
参见 术语表
时,Unity 会将该包视为项目的依赖项(直接依赖项)。但是,包也可以依赖于其他包,从而在需要该包的任何项目中创建间接依赖项当您的项目请求一个本身“依赖于”另一个包的包时,就会发生间接或传递依赖项。例如,如果您的项目依赖于[email protected]包,而该包又依赖于[email protected]包,那么您的项目对 Alembic 具有直接依赖项,对 Timeline 具有间接依赖项。 更多信息
参见 术语表

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

A graph of direct and indirect package dependencies for a project
项目直接和间接包依赖项的图形

在此示例中

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

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

选择最佳解决方案

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

锁定文件和 resolutionStrategy

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

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

示例

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

使用直接和间接依赖项集,包管理器会选择 burst 包的最高版本([email protected]),它满足[email protected]包的依赖项

In the dependency graph, the blue nodes indicate which versions the Package Manager selected
在依赖项图中,蓝色节点指示包管理器选择的版本




  • Unity 2019.4 中添加了新的包依赖项求解器 (SAT) NewIn20194


作用域注册表
锁定文件