0

这与 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 在这里是正确的,但我知道它不正确。

4

1 回答 1

0

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

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

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

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

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

于 2018-05-02T08:41:43.020 回答