0

我们正在迁移到 Visual Studio Professional 2012,现在可以访问代码分析。

之前,我们使用 FxCop 并传递了SourceControlPath\OurFxCopSharedProject.FxCop. 我们还在CustomDictionary.xml包含 FxCop.exe 的(源代码控制)文件夹中添加了一个。这很有效,因为我们使用了许多行业特定的术语并标准化了我们的分析规则。

在 VS 2012 中,似乎必须将代码分析字典应用于每个项目,并且必须为每个项目指定规则集

有没有办法将现有项目和新项目默认为我们的标准.rulesetCustomDictionary.xml(而不是 Microsoft 最低推荐规则和标准字典)?我们有数百个解决方案和更多项目。

4

1 回答 1

1

是的,至少你可以在 VS2010 上运行,而且我认为它在 VS2012 上也一样。

我按照这篇博文中描述的细节进行了操作,这对我来说非常有用。

VS2010 中还有一个问题,即为第一个构建的项目配置的规则集成为所有项目的规则集,无论配置了什么。这对我来说效果不佳,因为我放宽了单元测试项目的规则。我认为(希望)它在 VS2012 中已修复,但如果不是,此过程也提供了解决方法。


更新

博客已不存在。我在http://web.archive.org/web/20140531211137/http://kentb.blogspot.co.nz/2011_01_01_archive.html找到了以下内容。

仍然可以在https://onedrive.live.com/?cid=328ba01b2a22de20&id=328BA01B2A22DE20%21178&authkey=!ALAeFtsfPqgdMCk找到示例解决方案

所有功劳归功于肯特·布加特


没有 Visual Studio 2010 的代码分析

这篇文章提供了有关如何将 Visual Studio 2010 的代码分析集成到您的构建中的分步说明。如果您还没有这样做,请阅读我的第一篇文章,了解将要实现的目标。如果您愿意,可以按照我上一篇文章中的说明集成 Visual Studio 2008 的代码分析。虽然您需要一台安装了 Visual Studio 2010 的机器,但一旦正确设置,这将不是构建项目的要求。我假设 Visual Studio 安装在默认位置 - 根据需要调整路径。

假设我们从以下目录结构开始:

Project 
    Lib 
    Src

第 1 步:复制代码分析工具

C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop复制to的全部内容Lib\Code Analysis

C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\CodeAnalysis复制to的全部内容Lib\Code Analysis

将以下文件复制到Lib\Code Analysis

  • C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualC\v4.0_10.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualC.Dll
  • C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.CodeAnalysis.Sdk\v4.0_10.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.CodeAnalysis.Sdk.dll
  • C:\Program Files\Microsoft Visual Studio 10.0\DIA SDK\bin\msdia100.dll C:\Program Files\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT\msvcp100.dll
  • C:\Program Files\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT\msvcr100.dll

步骤 2:创建代码分析目标文件

创建一个名为的文件CodeAnalysis.targets并将其放在您的Src目录中。这是此文件内容的起点。您应该根据需要进行调整:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <!--
        Inject our own target before the code analysis runs.
        -->
        <RunCodeAnalysisDependsOn>
            ConfigureCodeAnalysis;
            $(RunCodeAnalysisDependsOn);
        </RunCodeAnalysisDependsOn>

        <!--
        Ensure code analysis is run
        -->
        <RunCodeAnalysis>True</RunCodeAnalysis>

        <!--
        Set this to false if you don't want all code analysis violations to be treated as errors.
        -->
        <CodeAnalysisTreatWarningsAsErrors>True</CodeAnalysisTreatWarningsAsErrors>
        <!--
        This should be set to resolve to the Lib directory, which must contain the code analysis tooling.
        -->
        <PathToLib>$(MSBuildProjectDirectory)\..\..\Lib\</PathToLib>
        <!--
        This should be set to resolve to the directory containing this targets file.
        -->
        <PathToTargets>$(MSBuildProjectDirectory)\..\</PathToTargets>

        <!--
        Setting these properties is required in order for the code analysis targets to execute correctly.
        Without setting these, it will look for the tooling under default installation directories instead
        -->
        <CodeAnalysisTargets>$(PathToLib)\Code Analysis\Microsoft.CodeAnalysis.Targets</CodeAnalysisTargets>
        <CodeAnalysisPath>$(PathToLib)\Code Analysis</CodeAnalysisPath>
        <!--
        Assign default code analysis rules
        -->
        <CodeAnalysisRuleSet>$(PathToTargets)CodeAnalysis.Default.ruleset</CodeAnalysisRuleSet>
    </PropertyGroup>
    <UsingTask AssemblyFile="$(PathToLib)\MSBuildSdcTasks\Microsoft.Sdc.Tasks.dll" TaskName="StringComparison"/>
    <Target Name="ConfigureCodeAnalysis">
        <!--
        Assume that any projects with ".Tests" in their names are test projects
        -->
        <StringComparison Comparison="Contains" Param1="$(AssemblyName)" Param2=".Tests">
            <Output TaskParameter="Result" PropertyName="IsTestProject"/>
        </StringComparison>
        <!--
        Assign different rules for test projects (more relaxed)
        -->
        <CreateProperty Condition="$(IsTestProject)" Value="$(PathToTargets)CodeAnalysis.Tests.ruleset">
            <Output TaskParameter="Value" PropertyName="CodeAnalysisRuleSet"/>
        </CreateProperty>
    </Target>
</Project>

第 3 步:创建规则集

在您的目录中创建名为CodeAnalysis.Default.rulesetand的文件。您可以使用 Visual Studio 2010 创建这些文件,方法是选择. 或者,您可以只复制下载示例中的文件。CodeAnalysis.Tests.rulesetSrcFile / New / File / Code Analysis Rule Set

第 4 步:为相关项目启用代码分析

对于每个需要代码分析的项目,打开 .csproj 文件并在导入之前插入以下内容Microsoft.CSharp.targets

<Import Project="..\CodeAnalysis.targets" />

注意:在导入 Microsoft.CSharp.targets 之前插入它非常重要,而不是之后。

第 5 步:根据需要进行调整

您可能希望调整CodeAnalysis.targetsCodeAnalysis.Default.rulesetCodeAnalysis.Tests.ruleset文件以更改启用的规则、使用规则集的条件等。如上所述,您可以使用 VS2010 创建和编辑.ruleset文件。

代码分析现在已与您的项目集成。从哪里构建无关紧要 - 无论是 Visual Studio、命令行还是构建服务器。在所有情况下,将为您的项目执行代码分析。您可以下载一个示例解决方案,在下面显示所有这些。

故障排除

如果你得到CA0001 Phx.FatalError,你可能需要msdia100.dll在构建机器上注册:

regsvr32 msdia100.dll

如果您的构建用户有足够的权限,您也可以将其合并到您的构建脚本中。

于 2012-11-20T22:18:23.657 回答