创建包含其他Nuget包的NuGet包 - NewtonSoft参考错误

时间:2017-06-13 16:53:46

标签: visual-studio tfs nuget

为各种常见库创建NuGet包的入门,这些库目前通常作为项目添加到解决方案中。

使用TFS 2017构建NuGet包并将其部署到TFS 2017内置的Package Manager。

我遇到了依赖项问题,并且不完全了解如何解决它。细节也有点复杂;所以这里。

  • 我已经构建了一个安装了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 = 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>

1 个答案:

答案 0 :(得分:1)

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

这通常适用于绑定重定向。在安装软件包时,NuGet应使用df1.info() RangeIndex: 157443 entries, 0 to 157442 Data columns (total 6 columns): Order_ID 157429 non-null object Date 157443 non-null int64 ... dtypes: float64(2), int64(2), object(2) memory usage: 7.2+ MB df1['Order_ID'].values array(['782833030', '782834969', '782836416', ..., '783678018', '783679806', '783679874'], dtype=object) 自动生成必要的绑定重定向到runnable(exe,web apps)项目。

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

csproj

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

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