0

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

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

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

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

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)

在搜索“network40”时,我无法让 Google 找到一个有用的帖子。

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

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

我试过了:

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

没有骰子。

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

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

先感谢您!

4

1 回答 1

1

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

问题是这个 nuget 包smtp-impostor 2.0.8与新的PackageReference 格式不兼容,并且与 NugetV3.4.4或 Nuget 无关V5.6.x

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

此外,作者没有对包进行任何更改以适应新的Packagereference。我也面临同样的问题。

建议

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

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

或者您可以包含 nuget 包的作者来更改它。

于 2020-07-20T08:07:29.070 回答