nuget 依赖解析器: 读取包内 .nuspec, 递归展开传递依赖, 完成目标框架匹配、版本冲突消解与资产(托管 dll / 原生库目录)选择。
NuGetResolver
00 Remarks
解析策略:
- 依赖展开: 以广度优先方式展开依赖图, 每个包只保留一个最终版本;
- 版本冲突: 与 NuGet 一致地"取较高版本" —— 在同一 id 上累积全部版本约束,
优先选择同时满足最多约束的最高版本, 因此版本选择单调不降, 展开过程必然收敛;
- 框架匹配: 依赖组与资产目录均按 的等级模型
选择"不高于目标框架的最高等级"者;
- 资产: 只收集 lib/ 与当前平台 runtimes/<rid>/lib 下的托管 dll
(排除附属资源 *.resources.dll), ref/ 为纯引用程序集(无 IL)因此不用于运行期。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| Resolve | 1 | 解析一个 nuget 包及其全部传递依赖。 |
| ResolvePackages | 1 | 解析入口: 返回根包与全部传递依赖(每个 id 只保留最终选定的版本)。 |
| SelectVersion | 1 | 在全部已有约束下选择版本。 |
| IsUnconstrained | 1 | 该版本范围是否未施加任何约束 |
| HasPrereleaseBound | 1 | 该版本范围的边界是否为 prerelease 版本 |
| LoadPackage | 1 | 把包取到本地缓存, 读取 nuspec, 解析依赖与资产 |
| SelectDependencyGroup | 1 | 选择与目标框架最匹配的依赖组 |
| FindBestFrameworkFolder | 1 | 在给定根目录下挑选与目标框架最匹配的子目录 |
| FindChild | 1 | 按 localName 查找子元素(忽略 xml 命名空间差异) |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| Client | 1 | 包获取客户端 |
| TargetFramework | 1 | 目标框架 moniker |
| AllowPrerelease | 1 | 是否允许选择 prerelease 版本 |
04 Fields
| Name | Overloads | Summary |
|---|---|---|
| MaxIterations | 1 | 依赖展开的最大迭代次数(防御性上限, 正常包图远小于此) |
05 Members
String, String, String, Boolean)解析一个 nuget 包及其全部传递依赖。
| Name | Type | Description |
|---|---|---|
packageId | String | 包 id |
versionConstraint | String | 版本或版本范围; 空/Nothing 表示取最新稳定版 |
targetFramework | String | 目标框架 moniker(如 net10.0) |
allowPrerelease | Boolean | 是否允许 prerelease 版本 |
String, String)解析入口: 返回根包与全部传递依赖(每个 id 只保留最终选定的版本)。
参数刻意命名为 versionConstraint 而非 versionRange: VB 是大小写不敏感的, 若命名为 versionRange 会屏蔽同名的 VersionRange 类型, 导致 VersionRange.Parse 解析失败。
String, List(Of VersionRange))在全部已有约束下选择版本。
与 NuGet 的解析规则保持一致:
- 没有任何版本约束(例如 #include "pkg")时, 取最新稳定版;
- 存在版本约束时, 取满足全部约束的最低版本 —— 这可以避免同一个包被
多个依赖要求时把不同大版本的组件混用在一起(例如宿主包是 8.x, 却选到 10.x 的依赖);
- 约束之间无法同时满足时, 退化为"满足最多约束的最低版本", 保证解析过程仍然收敛。
另外, 若约束的下/上界本身是 prerelease 版本(例如精确锁定 1.0.0-beta), 则会自动放开 prerelease 过滤, 否则锁定 prerelease 的写法永远无法命中。
该版本范围是否未施加任何约束
该版本范围的边界是否为 prerelease 版本
String, NuGetVersion)把包取到本地缓存, 读取 nuspec, 解析依赖与资产
List(Of NuGetDependencyGroup))选择与目标框架最匹配的依赖组
String)在给定根目录下挑选与目标框架最匹配的子目录
XElement, String)按 localName 查找子元素(忽略 xml 命名空间差异)
包获取客户端
目标框架 moniker
是否允许选择 prerelease 版本
依赖展开的最大迭代次数(防御性上限, 正常包图远小于此)