我有一个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" />
我抱怨两件事:
如果我打开NuGet包管理器,它显示我在当前项目中使用Newtonsoft.Json版本10.0.3:
这不是真的,因为当我在bin文件夹中构建解决方案时,它存储在8.0.3版本中
并且无法更新Newtonsoft.Json,因为它已经&#34;已经&#34;更新。
此外,我的项目和需要vesion 10的LibB实际上使用的是版本8.
我无法决定自动维护版本10,实际上我必须手动合并并纠正所有.config和.csproj文件!
有办法避免这种噩梦吗?
额外信息。
该项目和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。
答案 0 :(得分:0)
您的第一次投诉不正确。 NuGet包管理器显示 NuGet包的版本,而不是DLL中嵌入的版本号。您可能会认为程序包管理器应该检测到这一点,但它实际上是由错误的LibA
程序包引起的边缘情况。
您对此修复是否正确:不应使用<file src="bin\$configuration$\**\*.*" exclude="**\*.pdb" target="lib\net40"/>
理想情况下,您只包括通过构建项目生成的程序集。如果您包含内部(例如MyCompany.Common.dll
)或外部(例如OtherCompany.dll
)的依赖项,则可能会遇到此问题。将依赖项放在内部NuGet服务器上。