【发布时间】:2017-08-16 16:14:56
【问题描述】:
我有一个 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,因为它“已经”更新了。
此外,我的项目和需要 vesion 10 的 LibB 实际上使用的是版本 8。我无法决定自动维护版本 10,实际上我必须手动合并和更正所有 .config 和 .csproj 文件!
有办法避免这个噩梦吗?
额外信息。
该项目和 LibB 设置在 .Net 4.7 上。
LibA 仍在 .Net 4.5 上。
LibA 和 LibB 部署在公司 NuGet 存储库中。
[更新]
正如 cmets 中所建议的,我将尝试不在 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。
【问题讨论】:
-
您可以使用新的 csproj 格式吗?没有提示路径,而且它似乎更好地应对这个......
-
LibA 似乎在其自己的 nupkg 文件 btw 中包含 Newtonsoft.Json.dll,这可能是问题的原因。
-
能否重新编写 liba nuget 包以引用 newtonsoft Json 而不是复制 DLL?
-
嗨,乔恩,该项目是在 VS2013 或 VS2015 中创建的,但现在我正在使用 VS2017 对其进行编码。实际上这是一些项目的解决方案。我可以添加一个使用 VS 2017 新创建的新测试项目,这是创建新 .csproj 格式的方法吗?你到底什么意思?你有链接吗?是的,这两个库都包括不同版本的 Newtonsoft 和 RestSharp 库。我无法改变这一点,这是正常的做法。我不喜欢的是 VS 将路径从我的包文件夹(已经有 Newtonsoft)更改为包含在第 3 方 NuGet 包中的路径。谢谢
-
嗨@dariogriffo。我不能改变 LibA,它不是我的。您的意思是在
中仅包含 MyCompany.**.dll 并依靠 来获取 Newtonsoft 和 NuGet 中存在的其他库?我会尝试一个不同的项目。非常感谢。
标签: .net nuget nuget-spec