2017-08-16 112 views
1

我有一个Visual Studio项目。
它需要Newtonsoft.Json库。
它被Visual Studio 2017的NuGet包管理器引用。 其实10.0.3版本。.Net NuGet包冲突 - DLL地狱回来了

该项目引用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> 

和应用程序/ 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:

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

但是离开WRONG ref erence到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,因为它“已经”更新。
    而且我的项目和LibB需要的vesion 10实际使用版本8

  2. 我无法决定自动保持10版,其实我有合并和正确的手动所有的.config和的.csproj档案

有没有办法避免这种噩梦?

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

[更新]
正如意见,我会尽量不要在力霸(和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。

+2

你能够使用新的csproj格式吗?没有提示路径,它似乎更好地应付这个... –

+2

它看起来像LibA在其自己的nupkg文件btw中包含Newtonsoft.Json.dll,这可能是导致问题的原因。 –

+0

你可以重写liba nuget包来引用newtonsoft Json而不是复制DLL吗? – dariogriffo

回答

0

您的第一个投诉是错误的。 NuGet软件包管理器向您显示NuGet软件包的版本,而不是嵌入在DLL中的版本号。你可能会说包管理器应该检测到这一点,但这实际上是一个由不好的LibA包引起的边缘情况。

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