.Net NuGet包冲突 - DLL Hell回来

时间:2017-08-16 16:14:57

标签: .net nuget nuget-spec

我有一个Visual Studio项目 它需要Newtonsoft.Json库。
它与Visual Studio 2017的NuGet包管理器一起引用。 实际上是版本10.0.3。

该项目引用了NuGet包LibA和LibB。

LibA使用Newtonsoft.Json版本8,这是在package.nuspec中定义的:

<dependency id="RestSharp" version="105.2.3" />
<dependency id="Newtonsoft.Json" version="8.0.3" />
<dependency id="CommonServiceLocator" version="1.3" />

LibB使用NewtonSoft.Json版本10,这是在package.nuspec中定义的:

<dependency id="RestSharp" version="105.1" />
<dependency id="Newtonsoft.Json" version="10.0.3" />

当我使用Visual Studio 2017的NuGet包管理器(在解决方案上)更新LibA包(例如从1.1版到1.2版)时 它会按预期在.csproj文件中更新LibA包的引用:

 -  <HintPath>..\packages\LibA.1.1\lib\net40\MyService.dll</HintPath>
 +  <HintPath>..\packages\LibA.1.2\lib\net40\MyService.dll</HintPath>

但它也更新了Newtonsoft.Json库的引用:

-  <Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
-  <HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
+  <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+  <HintPath>..\packages\LibA.1.2\lib\net40\\Newtonsoft.Json.dll</HintPath>

和app / web.config文件:

-  <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
+  <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />

它还正确更新package.config中的LibA引用:

 -  <package id="LibA.MyService" version="1.1" targetFramework="net45" />
 +  <package id="LibA.MyService" version="1.2" targetFramework="net45" />

但它保留了对Newtonsoft.Json库版本的错误引用:

<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net47" />

我抱怨两件事:

  1. 如果我打开NuGet包管理器,它显示我在当前项目中使用Newtonsoft.Json版本10.0.3:
    这不是真的,因为当我在bin文件夹中构建解决方案时,它存储在8.0.3版本中 并且无法更新Newtonsoft.Json,因为它已经&#34;已经&#34;更新。
    此外,我的项目和需要vesion 10的LibB实际上使用的是版本8.

  2. 我无法决定自动维护版本10,实际上我必须手动合并并纠正所有.config和.csproj文件

  3. 有办法避免这种噩梦吗?

    额外信息。
    该项目和LibB设置在.Net 4.7上 LibA仍在使用.Net 4.5 LibA和LibB部署在NuGet公司的存储库中。

    [更新]
    正如评论中所建议的,我将尝试不在LibA(和LibB)包中包含Newtonsoft.Json库。实际上它发生是因为这(我认为):

      <files>
        <file src="bin\$configuration$\**\*.*" exclude="**\*.pdb" target="lib\net40"/>     
      </files>
    

    我把它更改为:

    <files>
        <file src="bin\$configuration$\**\MyCompany.*.*" exclude="**\*.pdb" target="lib\net40"/>     
    </files>
    

    并且它有效,Newtonsoft.Json包取自NuGet。

1 个答案:

答案 0 :(得分:0)

您的第一次投诉不正确。 NuGet包管理器显示 NuGet包的版本,而不是DLL中嵌入的版本号。您可能会认为程序包管理器应该检测到这一点,但它实际上是由错误的LibA程序包引起的边缘情况。

您对此修复是否正确:不应使用<file src="bin\$configuration$\**\*.*" exclude="**\*.pdb" target="lib\net40"/> 理想情况下,您只包括通过构建项目生成的程序集。如果您包含内部(例如MyCompany.Common.dll)或外部(例如OtherCompany.dll)的依赖项,则可能会遇到此问题。将依赖项放在内部NuGet服务器上。