多目标NuGet程序包的错误依赖关系解决

时间:2018-10-10 16:31:43

标签: c# visual-studio nuget nuspec

在NuGet中使用group-based dependency specification时如何解决依赖关系使我感到困惑。

我有一个针对.NET Framework 4.6.1的Visual Studio项目,该项目具有NuGet包的NuGet依赖项(在我公司内部):

这在我项目的packages.config文件中:

<package id="Name.Of.My.Package" version="2.0.65" targetFramework="net461" />

这是在.csproj文件中:

<Reference Include="Name.Of.My.Package, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <HintPath>..\packages\Name.Of.My.Package.2.0.65\lib\net45\Name.Of.My.Package.dll</HintPath> </Reference>

该软件包是具有基于组的依赖关系规范的多目标软件包,当我直接从通过打开.nuspec文件作为存档而获得的packages\Name.Of.My.Package.nupkg文件中获取该软件包时,它看起来像这样:

<dependencies> <group> <dependency id="Newtonsoft.Json" version="11.0.2" /> </group> <group targetFramework=".NETFramework4.0"> <dependency id="Microsoft.Bcl.Async" version="1.0.168" /> </group> </dependencies>

packages\Name.Of.My.Package\lib文件夹包含:

  • net40
  • net45
  • nestandard2.0

所以我的理解是,由于我的项目位于net461中,因此应将引用添加到我的软件包的net45版本中(就像我查看.csproj文件时的情况一样),但更重要的是,唯一的隐式依赖关系应该是Newtonsoft。

但是,当我尝试在程序包管理器控制台中删除Microsoft.Bcl.Async程序包时,就会发生这种情况:

Uninstall-Package Microsoft.Bcl.Async Attempting to gather dependency information for package 'Microsoft.Bcl.Async.1.0.168' with respect to project 'Name.Of.My.Project', targeting '.NETFramework,Version=v4.6.1' Resolving actions to uninstall package 'Microsoft.Bcl.Async.1.0.168' Uninstall-Package : Unable to uninstall 'Microsoft.Bcl.Async.1.0.168' because 'Name.Of.My.Package.2.0.65' depends on it.

这发生在最新版本的Visual Studio 2017(15.8.6)中。

1 个答案:

答案 0 :(得分:0)

  

多目标NuGet程序包的错误依赖关系解决

这是nuget的正确行为。众所周知,.NET Frameworks是向后兼容的。这意味着,如果您的项目以v4.6为目标,则可以使用较低版本的软件包,例如v4.5v4.0

  

NuGet的专长是兼容性检查(如果已编写软件包)   正确地ofc):) NuGet知道可用的框架是v3.5,v4.0,   v4.6和netstandard1.3。 与v4.5兼容的“最近”框架   是v4.0,因此安装时会选择v4.0资产

来源:How to figure out the information of dependency packages for missing frameworks

因此nuget将安装依赖项“最近”向后兼容的框架v4.6.1,在这种情况下,还将安装依赖项Microsoft.Bcl.Async

这就是为什么在安装软件包Microsoft.Bcl.Async后无法卸载软件包Name.Of.My.Package的原因。

例如,当您将包Microsoft.AspNet.WebApi.Client 5.2.6添加到.net Framework 4.6.1项目时,nuget还将在.net Framework 4.5下添加依赖项Newtonsoft.Json (>= 6.0.4)

enter image description here

enter image description here

检查this document了解更多详细信息。