我处于幸福的境地(</sarcasm>
)我在一个包含 168 个项目的 Visual Studio 2012 解决方案上工作。
我们正在处理其中大约 15 个,以及我们不接触的其他一些。
当我们对整个解决方案运行代码分析时,它会运行 23 分钟,这有点长......
但是,当我们必须在每次签入时弄清楚哪些项目被触及,这样我们就可以只对这些项目进行代码分析,这也是一种痛苦。
所以问题是是否可以创建一组自定义项目来运行代码分析?
我处于幸福的境地(</sarcasm>
)我在一个包含 168 个项目的 Visual Studio 2012 解决方案上工作。
我们正在处理其中大约 15 个,以及我们不接触的其他一些。
当我们对整个解决方案运行代码分析时,它会运行 23 分钟,这有点长......
但是,当我们必须在每次签入时弄清楚哪些项目被触及,这样我们就可以只对这些项目进行代码分析,这也是一种痛苦。
所以问题是是否可以创建一组自定义项目来运行代码分析?
简而言之,Visual Studio 无法在解决方案中的项目子集上运行其代码分析工具。
但是,您可以考虑一些可能的解决方法。
将活动项目提取到单独的解决方案中:
创建一个新的空白解决方案,将所有现有的活动项目添加到其中,并在较小的解决方案上运行代码分析。由于项目文件相同,因此解决方案将保持同步。如果这些项目依赖于非活动项目,可能会给出虚假报告。
对非活动项目使用空规则集:
添加“代码分析规则集”类型的新文件,对其进行编辑,在其“属性”窗口中将其名称更改为“无规则”,然后取消选中所有规则(如果已选中)。
然后转到您的解决方案属性,选择“通用属性 -> 代码分析设置”,并将非活动项目的所有规则集更改为“无规则”。您可以在 306 次点击中完成此操作。
这将为代码分析提供最佳运行时间,但也会在结果窗口中出现CA0064:未执行分析,因为指定的规则集不包含任何 FxCop 规则。
对非活动项目使用简单的规则集:
如上所述,但随后将任何一条您根本不希望看到的规则添加到“无规则”中。这将使代码分析变慢(但仍比使用实际规则集快得多)并且您将不再收到警告 CA0064。
老实说,Visual Studio 的内置代码分析存在一些基本缺陷,我建议使用专业的外部工具,如 ReSharper,或其他评论中建议的工具。使用空/琐碎的规则集当然应该达到所需的结果,但它更多的是一种解决方法,而不是实际的解决方案。
如果您不愿意重新审视您的解决方案方法(与其他方法一样,我强烈推荐这种方法),多个解决方案构建配置可能是启用不同程序集以在各种情况下进行代码分析的最简单方法。例如,您可能希望考虑如下一组解决方案配置(其中“核心”项目是您通常从事的 15 个项目):
(如果您愿意对项目配置有所了解,将项目级配置的相关部分外部化到导入的 MSBuild .targets 文件将使管理所有这些变得更加简单,特别是考虑到受影响项目的数量。)
大多数开发人员可能会选择在 DebugNoBuild 或 DebugCompileOnlyCore 下进行大部分日常活动,并且可以选择 Debug 或 DebugCore(您认为合适)进行预提交规则验证。通常,我建议对持续集成构建使用完整的调试(以及所有相关的静态分析),但考虑到完整分析的持续时间,这在您的情况下可能不切实际。如果您使用 CI,最好使用 DebugCore(或编译所有内容但仅在核心项目上运行静态分析的变体)进行 CI 构建,然后添加比每天更频繁地运行的定期计划构建(比如每个一两个小时)运行使用完整调试配置的构建。
您可以从外部构建文件(build.proj - 在解决方案的目录中)轻松完成:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Build">
<MSBuild Projects="TestSolution.sln" Properties="RunCodeAnalysis=false"></MSBuild>
<MSBuild Projects="ClassLibrary1\ClassLibrary1.csproj" Targets="RunCodeAnalysis"></MSBuild>
<MSBuild Projects="ClassLibrary2\ClassLibrary2.csproj" Targets="RunCodeAnalysis"></MSBuild>
</Target>
</Project>
可以使用外部工具从 Visual Studio 内部运行脚本(如果您的团队不喜欢 shell)。
希望这可以帮助。