【问题标题】:Visual Studio repeatedly rebuilds projects after code analyser is updated代码分析器更新后,Visual Studio 反复重建项目
【发布时间】:2018-10-05 01:21:40
【问题描述】:

这与 Visual Studio 2017 社区有关。我们的大部分构建过程更喜欢 VS2015 工具,但也已更新为在 VS2017 工具下构建。

  • 假设我们有一个项目 MyProject.csproj,它引用了代码分析器二进制文件 MyAnalyzer.dll。
  • MyProject 是我们解决方案中被大量引用的库(树中有大约 100 个项目),而且它很少更改。
  • 所以是时候向 MyAnalyzer 添加新规则了。我们将新版本放入 repo,覆盖旧版本。
  • 突然之间,MyProject 和所有依赖它的东西每次都在重建!

Visual Studio 提供的有用的诊断消息:

项目“MyProject”不是最新的。输入文件 '..\codeanalysis\bin\myanalyzer.dll' 在输出文件 '' 之后被修改。

自行构建 MyProject 会表现出这种行为,每次。但是在强制重建 MyProject 并让其余项目自行解决之后,问题就消失了。

当然,直到下一次我们更新 MyAnalyzer。

  • Visual Studio 在确定是否需要构建时会考虑项目代码分析器库的修改时间。
  • 项目的构建将提前退出,因为检测到不需要构建。输出文件当然不会更新其时间戳。
  • 因此,Visual Studio 每次都会构建项目,除了依赖它的所有内容之外,MSBuild 只会说“不,无事可做”大约一百次。
  • 对于 100 个项目的解决方案,这可能会导致常规构建需要将近一分钟的时间,而实际上只需要花费几秒钟来构建实际更改的内容。

MSBuild 很清楚没有任何改变。有没有办法告诉 Visual Studio? 我知道 技术上 VS 在这里是正确的,但我知道它不正确。

【问题讨论】:

  • 您是否在您的myanalyzer 项目中将任何资源设置为Copy always?如果是,myanalyzer.dll 将被跟踪为不是最新的。 zhylich.blogspot.jp/2016/03/…
  • 就该解决方案而言,MyAnalyzer.dll 是一个静态文件,即。它没有被重建为 MyProject 的依赖项。
  • 您是否在将规则更改为 MyAnalyzer 后尝试清理您的项目?您的项目似乎总是使用旧的 MyAnalyzer 但输入更新,这导致每次构建。
  • 这确实可以解决问题,因为它会强制进行完整构建。不过,关键是要避免这样做。

标签: visual-studio msbuild microsoft.codeanalysis


【解决方案1】:

最终看起来我确实在这里做错了事。试图抑制 VS 的更改检测是不正确的,我应该做的是在分析器更改时强制 MSBuild 重建。

所以基本上,让 MSBuild 的变更检测行为与 VS 匹配,而不是相反。

我通过将分析器程序集作为隐藏的虚拟内容项添加到每个项目来实现这一点,因此我的常见 ItemGroup 现在看起来像:

<ItemGroup>
  <Analyzer Include="@(AnalyzerAssemblies)" />
  <Content Include="@(AnalyzerAssemblies)">
    <Private>False</Private>
    <Visible>False</Visible>
  </Content>
</ItemGroup>

这似乎有预期的结果,导致 MSBuild 在 VS 调用它时考虑分析器时间戳,这使得整个解决方案重建一次然后稳定下来。

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2020-08-24
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多