共享代码分析规则和词典

时间:2012-11-19 23:00:28

标签: visual-studio-2012 code-analysis fxcop

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

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

在VS 2012中,似乎是Code Analysis Dictionary must be applied to each projectRule Set must be specified for each project

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

1 个答案:

答案 0 :(得分:1)

是的,至少你能为VS2010做好准备,我认为它对VS2012来说也是一样的。

我遵循this blog post中描述的细节,对我来说非常有用。

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

找到样本解决方案

所有赠送金额均转至Kent Boogaart


不使用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的全部内容复制到Lib\Code Analysis

C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\CodeAnalysis的全部内容复制到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.ruleset目录中创建名为CodeAnalysis.Tests.rulesetSrc的文件。您可以通过选择File / New / File / Code Analysis Rule Set使用Visual Studio 2010创建这些文件。或者,您可以从下载中的示例中复制文件。

第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

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