【问题标题】:Creating a NuGet package that includes other Nuget Packages - NewtonSoft Reference Errors创建包含其他 Nuget 包的 NuGet 包 - NewtonSoft 参考错误
【发布时间】:2017-11-15 13:53:20
【问题描述】:

开始为各种常见库创建 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 - 项目很好。没有错误 - 更新牛顿软件 - 像以前一样再次获取错误

如果我在 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=30ad4fe6b2a6aeed”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

无法运行的解决方案的 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>

【问题讨论】:

  • 您是否忘记添加实际错误?无论如何,您似乎遇到了经常被批评的默认安装最低通用版本的依赖项,这是 Visual Studio 中 NuGet 客户端中的一个选项,您可以尝试将其设置为“最高”。
  • @CodeCaster 啊,抱歉 - 刚刚添加。参考那个设置,我现在去检查一下,谢谢!
  • @CodeCaster - 所以我使用该设置重建了 TestNuGet;所以添加 SharpRaven 安装了 Newtonsoft 10.0.2。然后我添加了具有相同设置的 TestNuGet。还是和上面一样的错误。
  • @Darren 您的解决方案 A-C 是什么类型的项目?应用程序或库?你使用 PackageReference 风格的 nuget 管理还是 packages.config?
  • @MartinUllrich - 我在 2 个 Web 解决方案和 2 个作为 Windows 服务安装的类库中使用了 nuget。它在网络解决方案上失败了。我正在使用 packages.config;我将 TFS 设置为使用 csproj 而不是 nuspec - 似乎比维护文件/依赖节点列表更容易。

标签: visual-studio tfs nuget


【解决方案1】:

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

这通常通过绑定重定向来解决。 NuGet 应在安装包时使用packages.config 自动生成必要的绑定重定向到可运行(exe、Web 应用程序)项目。

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

<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>

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

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

【讨论】:

  • 答案在这个答案的最后一句。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多