当可移植和非可移植类库同时存在时,NuGet如何解决引用关系?

5
我正在开发一个可移植类库,并想了解NuGet用于确定是否使用PCL或平台特定库(如果存在)的策略。
我创建了一个示例项目,引用了支持多个平台和可移植类库的JSON.NET。以下是JSON.NET从NuGet提供的内容:
- net20 - net35 - net40 - sl3-wp - sl4 - sl4-windowsphone71 - winrt45 - portable-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。如果是这样,我不知道以下情况将如何解决:
Library A有两个版本:
- net40 - portable-net40+sl4+wp7+win8
Library B引用了A并有一个版本:
- portable-net40+sl4+wp7+win8
最后,library C同时引用了A和B,并有一个版本:
- net40
对于C,将如何解决对lib A的引用?由于C直接引用A,因此它应该获取A的net40版本。但是,由于C还引用了B,而B是可移植的,因此它还应该获取A的便携式版本。因此,必须部署库A的便携式和net40版本,以便C可以解决其依赖关系。我理解的对吗?
更新。我创建了几个测试项目,看起来只要库C包含对非便携式库A的直接引用,它就会获胜并覆盖A的PCL版本。因此,似乎不允许这种情况发生-如果库间接引用了不同(可移植)版本的库,则库不能直接引用非便携式库。
1个回答

4
NuGet在决定引用哪个库的版本时,会使用“最具体”或“最窄”的匹配。
您的库的可移植版本应与特定平台版本的库兼容。我认为这只是不同框架版本之间兼容性的更一般情况。在您的示例中,将net40和portable替换为net45和net40。在这种情况下,NuGet应该使用依赖项的.NET 4.5版本,但如果您有另一个依赖项编译针对.NET 4版本,则如果在运行时它有.NET 4.5版本,它也应该可以工作。
要兼容,您的库的不同版本应具有相同的标识(名称、版本号和(如果适用)强名称密钥),并且应该是API兼容的,这意味着特定平台的库版本应具有与可移植版本在该平台上运行时相同的所有API(但特定平台版本可以添加其他API)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接