我正在开发一个可移植类库,并想了解 NuGet 使用的策略来确定它是否应该使用 PCL 或特定于平台的库(如果存在)。
我构建了一个引用 JSON.NET 的示例项目,它支持各种平台以及可移植类库。以下是 NuGet 提供的 JSON.NET:
- 净20
- 网35
- 净40
- sl3-wp
- SL4
- sl4-windowsphone71
- winrt45
- 便携-net40+sl4+wp7+win8
首先,我创建了一个面向 NET 4.0 的库,并使用 NuGet 添加了对 JSON.NET 的引用。它添加了对 net40 库的引用。好的,我认为这是因为存在精确的目标平台匹配。然后我针对 NET 4.0.3。仍然引用了net40版本。然后我尝试了 Silverlight 5,它在非便携式库中没有完全匹配。但是选择了一个 sl4 库。并且针对 Windows Phone 8 导致了 sl4-windowsphone71 库的选择。
所以看起来只要目标平台有一个不可移植的兼容库,它就会被优先考虑。在 JSON.NET 的情况下,仅当另一个可移植库引用 PCL 时才会选择它。如果是这样,我很困惑以下情况将如何解决:
库 A 有两个版本:
- 净40
- 便携-net40+sl4+wp7+win8
库 B 引用 A 并有一个版本:
- 便携-net40+sl4+wp7+win8
最后,库 C 引用 A 和 B 并且有一个版本:
- 净40
将如何引用为 C 解析的库 A?由于 C 直接引用 A,它应该获得 A 的 net40。但由于 C 还引用了可移植的 B,它还应该获得 A 的可移植版本。因此,必须为 C 部署库 A 的可移植版本和 net40 版本解决其依赖关系。我对么?
更新。我创建了几个测试项目,看起来只要库 C 包含对不可移植库 A 的直接引用,这个版本的库就会获胜并覆盖 A 的 PCL 版本。所以看起来像这样的场景不允许 - 如果库也间接引用了它的不同(便携)版本,则它不能直接引用非便携库。