Visual studio 创建包含其他NuGet包的NuGet包-NewtonSoft引用错误

Visual studio 创建包含其他NuGet包的NuGet包-NewtonSoft引用错误,visual-studio,tfs,nuget,Visual Studio,Tfs,Nuget,开始为各种公共库创建NuGet包,这些库到目前为止通常作为项目添加到解决方案中 使用TFS 2017构建NuGet软件包并将其部署到TFS 2017中内置的软件包管理器 我有一个依赖性问题,不完全理解如何解决它。细节也有点复杂;这就来了 我构建了一个类库,其中安装了一个NuGet包——该包是SharpRaven 2.2.0 SharpRaven依赖于NewtonSoft.Json>=6.0.8 这导致Newtonsoft.Json被添加到我的类库中。默认情况下,安装了NewtonSoft.Jso

开始为各种公共库创建NuGet包,这些库到目前为止通常作为项目添加到解决方案中

使用TFS 2017构建NuGet软件包并将其部署到TFS 2017中内置的软件包管理器

我有一个依赖性问题,不完全理解如何解决它。细节也有点复杂;这就来了

我构建了一个类库,其中安装了一个NuGet包——该包是SharpRaven 2.2.0 SharpRaven依赖于NewtonSoft.Json>=6.0.8 这导致Newtonsoft.Json被添加到我的类库中。默认情况下,安装了NewtonSoft.Json 6.0.8。 然后,我将类库打包为一个NuGet包,称之为TestNuGet TFS正在使用.csproj文件而不是nuspec构建nuget 当我在项目中使用这个新软件包时,我发现SharpRaven和Newtonsoft存在依赖关系,如果项目中当前没有安装这两个软件包

我的问题始于Newtonsoft.Json

以以下项目为例:

解决方案A和B -已经有了Newtonsoft 9.0.1。 -安装TestNuGet,因此还添加了SharpRaven -项目很好,使用TestNuGet时没有错误

溶液C -已经有了Newtonsoft 9.0.1。 -安装TestNuGet,因此还添加了SharpRaven -调用TestNuGet时出错;错误如下:

溶液C -拆下Newtonsoft 9.0.1 -安装TestNuGet、SharpRaven和Newtonsoft 6.0.8 -这个项目很好。没有错误 -更新Newtonsoft -像以前一样再次获取错误

如果我在TestNuget中将NewtonSoft更新为9.0.1并重建它,我会遇到与上面完全相同的问题

解决方案C中没有引用9.0.1以外的任何项目

在我看来,当添加NuGet包时,NuGet会查看其中的所有包并使用这些依赖项,而忽略已经添加到TestNuget中的内容

所以我想,问题是,有没有一种方法可以指导nuget使用我添加到TestNuget中的newtonsoft版本,而不是尝试满足sharpraven所要求的依赖性?可能需要向Packages.config中添加一些内容

使用nuspec文件会更好吗?是否有更多可以设置的内容来控制包的构建方式

或者是我在使用这些软件包时遗漏了什么

尝试使用包时引发的错误是:

无法加载文件或程序集“Newtonsoft.Json,Version=6.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6eed”或其依赖项之一。定位的程序集清单定义与程序集引用不匹配。来自HRESULT的异常:0x8013100

将不运行的解决方案的web.config的绑定重定向如下所示:

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
我还尝试调整重定向以封装9.0.1

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-9.0.1.0" newVersion="9.0.1.0" />
</dependentAssembly>

这里的问题是程序集引用了NewtonSoft.Json的版本6,但在运行时找不到该版本,因为只有更高版本存在

这通常通过绑定重定向解决。安装软件包时,NuGet应使用packages.config自动生成必要的绑定重定向到runnable exe、web应用程序项目中

对于基于PackageReference的项目,有时还需要测试项目、插件库……来告诉msbuild根据解析的程序集自动生成所需的绑定重定向。这可以通过将以下内容添加到csproj文件中来实现:

但是,这并不能防止库的新主要版本中可能发生的实际破坏性更改


还请注意,这些绑定重定向可能会被重新使用构建的程序集父项目、插件系统等的其他应用程序的绑定重定向覆盖。

您是否忘记添加实际错误?不管怎么说,您似乎遇到了经常被批评的默认设置,即安装依赖项的最低通用版本,这是Visual Studio中NuGet客户端中的一个选项,您可以尝试将其设置为最高。@CodeCaster啊,对不起-刚刚添加了它。参考那个设置,我现在去检查一下,谢谢@CodeCaster——因此我使用该设置重建了TestNuGet;因此,添加SharpRaven安装了Newtonsoft 10.0.2。然后,我添加了具有相同设置的TestNuGet。仍然存在与上面相同的错误。@Darren您的解决方案A-C是什么类型的项目?应用程序还是库?您是否使用PackageReference样式的nuget管理或packages.config?@MartinUllrich-我在作为windows服务安装的2个web解决方案和2个类库中使用了nuget。它在web解决方案上失败了。我正在使用packages.config;我将TFS设置为使用csproj而不是nuspec,这似乎比维护文件/依赖节点列表更容易。谢谢
<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>