繁体   English   中英

在分支之间转换时生成错误:您的项目未引用“.NETFramework,Version=v4.7.2”框架

[英]Build error while transitioning between branches: Your project is not referencing the ".NETFramework,Version=v4.7.2" framework

我们正在使用 Git,我们有一个针对完整网络框架的解决方案。 几天前,我开始将解决方案迁移到 .net 核心。 不幸的是,出现了一些事情让我回到 master 分支(它有完整的 .NET 框架的代码)。 每当我尝试构建应用程序时,都会收到以下错误:

1>D:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\MSBuild\\Microsoft\\NuGet\\15.0\\Microsoft.NuGet.targets(186,5): 错误:您的项目没有引用“.NETFramework,版本 = v4.7.2" 框架。 在 project.json 的“frameworks”部分添加对“.NETFramework,Version=v4.7.2”的引用,然后重新运行 NuGet 还原。

我试过清理 nuget 包,运行 git reset,但似乎没有任何帮助。 知道发生了什么吗?

将某些项目从 4.6.2 升级到 4.7.2 时,我遇到了类似的问题 - 针对完整框架的 ASP.Net Core 解决方案和我们的 WPF 解决方案都发生了这种情况。

最初似乎是出现此错误的随机项目,其他具有几乎完全相同 csproj 的项目构建良好,而其他项目则失败。 消息中的“重新运行 NuGet 还原”也让我走上了错误的道路(其中一些项目甚至没有 NuGet 引用......)

该问题似乎源于包含 project.assets.json 文件的项目 obj 文件夹,我不确定它是何时生成的 - 可能是过去的遗物,清理项目并不会删除它。 该文件指向以前的框架,在我的情况下为 4.6.2 -手动删除每个项目的 bin/obj 文件夹,这些项目不会构建然后重建为我解决了这个错误 这也可以解释为什么当我出于理智而克隆 repo 时,它也构建得很好。

通过自定义 Visual Studio Build Event自动删除非核心项目的project.assets.json来解决此问题。

更新 (6/13/2020)原来删除project.assets.json导致显示波浪线,因为 Intellisense 需要文件中的引用。 因此,更好的解决方法是使用Pre-build事件仅在项目不是.Net Core 时删除文件

这在我的计算机上由$(TargetFramework) ---> "netcoreapp3.1"标识。 您安装的框架可能会显示不同的标识符,因此相应地更新脚本(请参阅第 2 行ECHO生成的构建输出窗口中的文本)。 注意:这可以是某些.Net Framework版本上的空字符串,这应该不是问题。 我们也只比较前 7 个字符来忽略版本,以避免在版本更改时/当版本更改时必须更新脚本。

SET _tgt=$(TargetFramework)
ECHO %_tgt%
IF NOT "%_tgt:~0,7%" == "netcore" (
    cd $(ProjectDir)\obj
    DEL project.assets.json
)

在此处输入图片说明

====更新 (6/13/2020) 到此结束。 原始答案保留在下面以提供上下文。 ====

我们将问题缩小到一个文件: {Your project}/obj文件夹中的project.assets.json 它是由.Net Core项目创建的文件,但在切换到导致 OP 提到的问题的.Net Framework项目后,Visual Studio 不会将其删除。

解决的办法是删除此文件,但,而不必每次我们需要转换项目手动删除它,我们创建了Visual Studio中的生成后事件每个成功的核心生成删除它(你的核心项目不会建如果您在构建之前运行脚本,显然)。 您可以自定义脚本以删除您认为有问题的任何文件/文件夹,但我们的问题仅限于该单个文件。

cd $(ProjectDir)\obj
del project.assets.json

注意:如果有问题的工件已经存在,您将需要手动删除一次,因为构建后事件只会在成功构建后运行。

在此处输入图片说明

  1. 调用git clean -dfX - 从工作树中删除未跟踪的文件
  2. 重建解决方案

MaxJ回答对我的情况很接近,但是我必须删除解决方案中每个项目的 bin 和 obj 文件夹,因为在不会构建的单个项目中这样做并没有修复构建。

为方便起见,我用于上述操作的 PS 应仅在您不介意删除这些文件夹的文件夹的根目录下运行(例如,在前端节点模块中可能是一个糟糕的地方):

gci -Include bin,obj -Recurse | Remove-Item -Force -Recurse

我删除了 obj 和 bin 文件夹并重建了项目。 Visual Studio 会自动创建要再次使用的“dll”文件。 它对我有用。

听起来您可能有一些与 Core 不兼容的库。 如果 Nuget 期望/需要 4.7.2,那么在您的项目或我愿意冒险的库中,可能仍有某些内容针对它。 还将解释为什么如果您要恢复的包仍然针对 4.7.2,清理 Nuget 包并恢复它们并不能解决问题。

相关说明,您确定使用的是最新的项目结构吗? 我注意到您的错误消息包含project.json ,它已被弃用以支持新的 csproj 格式; 如果相关, 这里有更多信息。 我不知道您会收到有关 project.json 的错误消息并且解决方案没有 project.json 的情况。

我发现只需使用 Agent Ransack 在我的 repo 上搜索 project.assets.json 然后删除这些文件,而不是整个 bin 和 obj 文件夹,就可以解决问题:)

我有同样的错误,bin/obj 清理没有帮助。 经过长时间的调查,我发现我错误地覆盖了IntermediateOutputPath以指向我所有项目的同一目录。 这在并行构建期间弄乱了 NuGet 中间文件。 修复Build.Directory.props以在IntermediateOutputPath包含$(MSBuildProjectName)为我解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM