5

我正在开发一个可移植类库,并想了解 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 版本。所以看起来像这样的场景不允许 - 如果库也间接引用了它的不同(便携)版本,则它不能直接引用非便携库。

4

1 回答 1

4

NuGet will use the "most specific", or the "narrowest" match possible when deciding which version of a library to reference.

The portable versions of your library should be compatible with the platform-specific versions of your library. I think of this as just the more general case of compatibility between different versions of a framework. In your example, replace net40 and portable with net45 and net40. In that case, NuGet should use the .NET 4.5 version of a dependency, but if you have another dependency compiled against the .NET 4 version, it should work if at runtime it has the .NET 4.5 version instead.

To be compatible, the different versions of your library should have the same identity (name, version number, and (if applicable) strong name key), and should be API compatible, which means that a version of your library for a specific platform should have all the same APIs as a portable version that can run on that platform (the platform specific version can add additional APIs, however).

于 2013-02-10T23:22:15.200 回答