当存在便携式和非可移植类库时,NuGet如何解析引用?

时间:2013-02-10 17:54:42

标签: nuget portable-class-library

我正在研究一个可移植的类库,并希望了解NuGet使用的策略,以确定它是否应该使用PCL或特定于平台的库(如果存在)。

我构建了一个示例项目,该项目引用了JSON.NET,它支持各种平台以及可移植类库。以下是JSON.NET从NuGet提供的内容:

  • net20
  • net35
  • net40
  • 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有两个版本:

  • net40
  • 便携式net40 + SL4 + WP7 + win8的

图书馆B引用A并有一个版本:

  • 便携式net40 + SL4 + WP7 + win8的

最后,库C引用了A和B,并且有一个版本:

  • net40

如何引用为C解析的lib?由于C直接引用A,它应该得到A的net40。但是由于C也引用了可移植的B,它还应该得到A的可移植版本。因此,必须为C部署库A的portable和net40版本解决其依赖关系。我是对的吗?

更新即可。我创建了几个测试项目,看起来只要库C包含对非可移植库A的直接引用,这个版本的库将获胜并覆盖A的PCL版本。所以它看起来像这样的场景不允许 - 如果库也间接引用了它的不同(可移植)版本,则库不能直接引用非可移植库。

1 个答案:

答案 0 :(得分:4)

在决定引用哪个版本的库时,NuGet将使用“最具体”或“最窄”匹配。

库的可移植版本应与库的特定于平台的版本兼容。我认为这只是框架的不同版本之间兼容性的更一般情况。在您的示例中,将net40和portable替换为net45和net40。在这种情况下,NuGet应该使用.NET 4.5版本的依赖项,但是如果你有另一个针对.NET 4版本编译的依赖项,那么它应该在运行时它具有.NET 4.5版本。

为了兼容,您的库的不同版本应具有相同的标识(名称,版本号和(如果适用)强名称密钥),并且应该是API兼容的,这意味着您的库的一个版本特定平台应该具有与可以在该平台上运行的可移植版本相同的API(但是,特定于平台的版本可以添加其他API)。