NuGet.exe 的较新版本在恢复旧包时无法解析框架匹配(net40、netframework40)

Newer versions of NuGet.exe can't resolve framework match when restoring older packages (net40, netframework40)

在这上面花了两天的大部分时间,是时候寻求帮助了。

我正在重新构建我们的 CI 版本,并有一个在 .net 4.6.1 上的 VS2017 解决方案,使用 packages.config 样式的 nuget 引用,而 TeamCity 使用的是 NuGet runner v3.4.4恢复包。它最初是使用 VS2008 或 10 构建的,然后在 2018 年转换为 2017。有人检查了 packages 目录,多年来一直如此。

是时候让它达到更现代的标准了。我将项目转换为使用 packageReference,现在正在使用 msbuild 和 restore;build 目标来恢复我的包并构建解决方案。效果很好,除了这个包。

即使在 VisualStudio 2017 15.8.7 中,构建(当然会进行恢复)也无法使用 packageReference 恢复 smtp-impost 或包,并出现以下错误:

NU1202: Package smtp-impostor 2.0.8 is not compatible with net461 (.NETFramework,Version=v4.0). Package smtp-impostor 2.0.8 supports: netframework40 (.NetFramework 4.0,Version=v0.0)

我在搜索“netframework40”时 Google 找不到一个有用的 post。

如果我使用 nuget3.4.4 CLI,它工作正常(它似乎调用 msbuild 4.0)。如果我使用 nuget 5.6 CLI,我会收到错误消息;它使用 Visual Studio 2017.

附带的 msbuild

我看到很多 post 关于如何让 nuget 使用不同版本的 msbuild,但我没有看到如何告诉 msbuild 使用早期版本的 nuget!

我试过:

  1. 将解决方案重新定位到 v4.0 - 发生同样的错误 - 错误的第一部分只是更改为 net40
  2. 将 csproj 文件标签中的 ToolsVersion 设置为 14.0
  3. 将 csproj 文件中的 PlatformToolsVersion 属性 设置为 14.0。

没有骰子。

我真的不想为这个项目留下 packages.config(以及额外的 CI 构建步骤),也不想将包的单个 DLL 签入我的存储库。看起来更像是我将不得不放弃 packageReference 升级并坚持使用旧式 nuget runner 包恢复。

有人见过这个吗? “netframework40”的来源以及为什么较新的 nuget 无法将其与 net40 匹配的任何想法?

提前致谢!

Newer versions of NuGet.exe can't resolve framework match when restoring older packages (net40, netframework40)

问题是这个 nuget 包 smtp-impostor 2.0.8 is not compatible with the new PackageReference format 与 Nuget V3.4.4 或 Nuget V5.6.x.

无关

实际上,包是在 2011 年发布的,从 VS2017 开始使用新的包管理格式 PackageReference

除此之外,作者没有对包进行任何更改以适应新的Packagereference。我身边也遇到了同样的问题。

建议

作为解决方法,您必须使用 packages.config 安装此 nuget 包而不是 PackageReference

VS2017 开始,VS 添加了新的 PackageReference nuget 管理格式,对于旧的 VS2008,它使用 Packages.config.

或者你可以包含nuget包的作者来改变它。