Visual Studio 代码分析器更新后重复重建项目
Visual Studio repeatedly rebuilds projects after code analyser is updated
这与 Visual Studio 2017 社区有关。我们的大部分构建过程更喜欢 VS2015 工具,但也已更新为在 VS2017 工具下构建。
- 假设我们有一个项目 MyProject.csproj,它引用了代码分析器二进制文件 MyAnalyzer.dll。
- MyProject 在我们的解决方案中是一个被大量引用的库(树中约有 100 个项目)并且它很少更改。
- 是时候向 MyAnalyzer 添加新规则了。我们将新版本放在 repo 中,覆盖旧版本。
- 突然之间,MyProject 以及依赖于它的所有内容每次都在重建!
Visual Studio 提供的诊断信息:
Project 'MyProject' is not up to date. Input file '..\codeanalysis\bin\myanalyzer.dll' is modified after output file ''.
单独构建 MyProject 表现出这种行为,每次。但是在强制重建 MyProject 并让其余项目自行解决后,问题就消失了。
当然,直到 下一次 我们更新 MyAnalyzer。
- Visual Studio 在确定是否需要构建时考虑项目代码分析器库的修改时间。
- 项目的构建将提前退出,因为检测到不需要构建。输出文件当然不会更新时间戳。
- 因此 Visual Studio 每次 都会构建项目 ,除了依赖于它的所有内容之外,只有 MSBuild 说 'nope, nothing to do' 大约一百个次。
- 对于 100 个项目的解决方案,这可能会导致常规构建花费将近一分钟的时间,而实际上只需要花几秒钟构建实际发生变化的内容。
MSBuild 很清楚没有任何变化。有什么办法可以告诉 Visual Studio 吗?
我知道技术上 VS 在这里是正确的,但我知道它不正确。
最后看来我这里确实做错了。试图抑制 VS 的更改检测是不正确的,我应该做的是在分析器更改时强制 MSBuild 重建。
所以基本上,让 MSBuild 的更改检测行为与 VS 匹配,而不是相反。
我通过将分析器程序集作为隐藏的虚拟内容项添加到每个项目来完成此操作,因此我的公共 ItemGroup 现在看起来像:
<ItemGroup>
<Analyzer Include="@(AnalyzerAssemblies)" />
<Content Include="@(AnalyzerAssemblies)">
<Private>False</Private>
<Visible>False</Visible>
</Content>
</ItemGroup>
这似乎有预期的结果,导致 MSBuild 在 VS 调用它时考虑分析器时间戳,这使得整个解决方案重建一次然后安定下来。
这与 Visual Studio 2017 社区有关。我们的大部分构建过程更喜欢 VS2015 工具,但也已更新为在 VS2017 工具下构建。
- 假设我们有一个项目 MyProject.csproj,它引用了代码分析器二进制文件 MyAnalyzer.dll。
- MyProject 在我们的解决方案中是一个被大量引用的库(树中约有 100 个项目)并且它很少更改。
- 是时候向 MyAnalyzer 添加新规则了。我们将新版本放在 repo 中,覆盖旧版本。
- 突然之间,MyProject 以及依赖于它的所有内容每次都在重建!
Visual Studio 提供的诊断信息:
Project 'MyProject' is not up to date. Input file '..\codeanalysis\bin\myanalyzer.dll' is modified after output file ''.
单独构建 MyProject 表现出这种行为,每次。但是在强制重建 MyProject 并让其余项目自行解决后,问题就消失了。
当然,直到 下一次 我们更新 MyAnalyzer。
- Visual Studio 在确定是否需要构建时考虑项目代码分析器库的修改时间。
- 项目的构建将提前退出,因为检测到不需要构建。输出文件当然不会更新时间戳。
- 因此 Visual Studio 每次 都会构建项目 ,除了依赖于它的所有内容之外,只有 MSBuild 说 'nope, nothing to do' 大约一百个次。
- 对于 100 个项目的解决方案,这可能会导致常规构建花费将近一分钟的时间,而实际上只需要花几秒钟构建实际发生变化的内容。
MSBuild 很清楚没有任何变化。有什么办法可以告诉 Visual Studio 吗? 我知道技术上 VS 在这里是正确的,但我知道它不正确。
最后看来我这里确实做错了。试图抑制 VS 的更改检测是不正确的,我应该做的是在分析器更改时强制 MSBuild 重建。
所以基本上,让 MSBuild 的更改检测行为与 VS 匹配,而不是相反。
我通过将分析器程序集作为隐藏的虚拟内容项添加到每个项目来完成此操作,因此我的公共 ItemGroup 现在看起来像:
<ItemGroup>
<Analyzer Include="@(AnalyzerAssemblies)" />
<Content Include="@(AnalyzerAssemblies)">
<Private>False</Private>
<Visible>False</Visible>
</Content>
</ItemGroup>
这似乎有预期的结果,导致 MSBuild 在 VS 调用它时考虑分析器时间戳,这使得整个解决方案重建一次然后安定下来。