Visual Studio 有时会在 PC 重新启动后重建未修改的项目

Posted

技术标签:

【中文标题】Visual Studio 有时会在 PC 重新启动后重建未修改的项目【英文标题】:Visual Studio Rebuilds unmodified projects sometimes after a PC reboot 【发布时间】:2019-02-11 07:49:48 【问题描述】:

我有一个包含大约 50 个 C# 项目的 Visual Studio 2013 解决方案。通常,如果我选择构建 (F6),它只会构建已更改的项目。但有时在我关闭并重新启动我的电脑后,当我选择构建 (F6) 时它会重建所有内容。为什么?

当我重新启动我的电脑时,这种情况并不总是发生。大多数时候它说所有项目在重新启动后都是最新的。但有时它会重建所有内容。

我查看了以下问题Visual Studio Rebuilds unmodified projects 及其答案。

我所做的下一步是将构建输出详细程度设置为诊断。

在 PC 重新启动后 Visual Studio 全部重建时,我得到以下输出:

1>Project 'Project1' is not up to date. Missing input file
...

有更多的行(超过 1000 行)。我看了看它们,但我仍然不明白为什么 Visual Studio 会重建项目。

更新

为什么 Visual Studio 需要以下文件?

1>Project 'Project1' is not up to date. Missing input file
'c:\users\wo\appdata\local\temp\.netframework,version=v4.5.assemblyattributes.cs'.
...

【问题讨论】:

可能有很多东西。 Project1 依赖的输入文件是什么?有外部依赖吗?您的项目是否构建到重启后被清除的文件夹?临时文件夹? RAM 驱动器? @MickyD Project1 依赖于两个未更改的 cs 文件和两个本机 dll 文件。重启后文件夹不会被清除。我正在使用 Subversion,构建文件夹在忽略列表中。 查看项目的 Pre-build 事件。 “缺少输入文件”让我很担心 @MickyD 没有预构建事件。 @MickyD 我已经编辑了我的问题。关于临时文件夹的评论帮助我更好地理解它。 【参考方案1】:

对于未来的旅行者,我认为这也只是当前版本的 Visual Studio 2019、16.6 和更高版本中的一个错误。

我使用 Visual Studio 2019 版本 16.6.0 和 16.6.1 时会出现此问题。我有跨版本的 C# 项目,在 2010、2015、2017 或 2019 16.5 及更早版本中,在同一台机器和同一用户上,在同一文件夹和解决方案中具有同一项目。

对于最近的 2019 版本(在最后一个月左右,2020 年 5 月和 6 月 1 日),我收到了类似的消息:

1>“香蕉”项目不是最新的。缺少输入文件 'c:\users\banana\appdata\local\temp.netframework,version=v4.7.2.assemblyattributes.cs'。

如果我清理然后构建,那么它是正常的。如果我运行一个连续的构建,我会得到错误。

无论是否重新启动,甚至在清理临时文件夹之后,或者我是否使用管理员运行 Visual Studio,都会发生这种情况。它试图找到的路径确实存在,如果粘贴到资源管理器中就会弹出。

我已经用新文件夹彻底清除了所有代码文件,但遇到了同样的问题。对我来说,它只适用于 C# 项目。所以我认为这是一个 16.6 的错误。

查看最近的变化:

KirillOsenkov 于 2020 年 1 月 4 日发表评论

@livarcocc 可以优先考虑这个吗?这是一个很容易解决的有影响力的问题,并且已经开放了三年。似乎是唾手可得的果实。

bording 于 2020 年 2 月 12 日发表评论

现在这个问题的修复被合并到 master 中,它将成为哪个版本的一部分?我看到这个问题是在 16.5 里程碑上,那么这是否意味着它会在那个版本中,或者修复也需要移植到另一个分支?

tmat 于 2020 年 2 月 12 日发表评论

@bording 我将里程碑更新为 16.6,因为我相信 master 是 16.6。

https://github.com/microsoft/msbuild/issues/1479

【讨论】:

我认为你是正确的,它是相关的。在将 VS2019 更新到 16.6.2 版本后,我开始看到这个问题。我发现将每个 *.csproj 文件的 <Project> 标记中的 ToolsVersion 属性更改为 15.0 (VS2017) 或 16.0 (VS2019) 如果它之前设置为旧版本,则可以解决我的问题。似乎在 ToolsVersion(应该默认为 Current)和 GitHub 问题中引用的更改之间存在某种错误。 要添加到@Nick 的评论中:我注意到使用 VS2019 16.6.5 的相同错误,并通过在每个 *.csproj 文件中设置 ToolsVersion="16.0" 来修复它。 VS 并没有在两个构建之间重新构建每个项目。有趣的是,在每个 *.csproj 上恢复 ToolsVersion 并没有使错误再次出现,所以我不必提交这个不符合其他团队成员的更改(仍在使用 VS2017)。【参考方案2】:

Visual Studio 有时会在 PC 重启后重建未修改的项目

导致此问题的一种可能是建筑帐户失去了对temp 文件夹的权限。 要解决此问题,您可以尝试将权限read/write/execute 授予temp 文件夹,或者尝试以管理员身份运行visual studio,看看它是否与权限相关.

我们知道,如果我们在 Visual Studio 中打开/构建一个项目,.NETFramework,Version=v4.x.AssemblyAttributes.cs 会自动出现在temp 文件夹中。如果重启PC后失去了temp文件夹的权限,或者没有以管理员身份运行Visual Studio,我们无法访问temp文件夹,那么Visual Studio会报告在@987654330中找不到文件version=v4.5.assemblyattributes.cs @文件夹。

或者,您也可以通过在项目文件中添加以下属性来将该文件生成到中间目录(通常称为 obj)中:

  <PropertyGroup>
    <TargetFrameworkMonikerAssemblyAttributesPath>$([System.IO.Path]::Combine('$(IntermediateOutputPath)','$(TargetFrameworkMoniker).AssemblyAttributes$(DefaultLanguageSourceExtension)'))</TargetFrameworkMonikerAssemblyAttributesPath>
  </PropertyGroup>

凭据:MSBuild: unnecessary rebuilds because of generated AssemblyAttributes.cs

希望这会有所帮助。

【讨论】:

我没有以管理员身份运行 Visual Studio,但丢失的文件位于当前用户 wo 的临时文件夹 c:\users\wo\appdata\local\temp 中。 你试过以管理员身份运行它吗?我知道该文件在那里,但如果你在重启后没有read/write/execute 的权限,那么你会遇到这个问题。 @Wollmich,如果授予临时文件夹读/写/执行权限或以管理员身份运行 Visual Studio 对您不起作用,您可以在我更新的答案中尝试另一种方法。让我知道它是否免费为您工作:)。 指定&lt;TargetFrameworkMonikerAssemblyAttributesPath&gt; 对我有用。以管理员身份运行 Visual Studio 对我来说不是一个选项。我的临时文件夹 c:\users\wo\appdata\local\temp 具有 read/write/execute 权限。所以我不知道为什么这不起作用。 为什么 OP 需要在其 Windows 配置文件下的文件夹上设置显式权限,特别是当该文件夹应默认继承父权限时?此外,VS 和 VBCSCompiler 再次以当前用户身份运行,无需明确许可,我没想到

以上是关于Visual Studio 有时会在 PC 重新启动后重建未修改的项目的主要内容,如果未能解决你的问题,请参考以下文章

将 Clearcase 与 Visual Studio 2010 重新集成?

VisualHg和Visual Studio 2010性能问题

构建时命令副本以代码 4 退出 - Visual Studio 重新启动解决了它

你如何强制 Visual Studio 为 aspx/ascx 文件重新生成 .designer 文件?

VS2012打开.sln项目文件时,会在根目录下自动创建“Visual Studio 2012”目录和其子目录,请教如何取消?

Visual Studio:智能感知问题和 Linux 兼容性