在没有安装Visual Studio 2013/2015的情况下运行代码分析(FxCop 12.0 / 14.0)

在FxCop 10之后,微软停止为FxCop发布一个单独的安装程序。 在安装Visual Studio 2013/2015之后,官方目前只能运行代码分析(FxCop 12.0 / 14.0)。但是,我们坚持不要在构build代理上安装Visual Studio(然后安装需要与我们保持同步有开发计算机等)。

那么如何让FxCop 12.0 / 14.0在构build代理上工作,最好不用安装其他东西? 不过,我会接受添加一些二进制文件和msbuild文件到源代码控制。 否则:有没有办法只使用Visual Studio 2013/2015安装程序安装FxCop的东西?

注意:我们使用Teamcity作为构build服务器。

! 对于FxCop 14.0 / VS2015看到这个答案 !

运行FxCop 12.0而不安装Visual Studio 2013

好吧,我已经投入了6个小时,现在正在工作。 我已经将所有必需的可执行文件,dll和msbuild目标添加到源代码pipe理。

这些是我必须添加到源代码pipe理的文件:(请认为这可能会违反一些许可协议)

(source control)\dev\tools\FxCop │ ├[amd64] │ │ │ └msdia120.dll ├[Engines] │ │ │ ├IntrospectionAnalysisEngine.dll │ └PhoenixAnalysisEngine.dll ├[Msbuild] │ │ │ ├fxcoptask.dll │ ├Microsoft.CodeAnalysis.Targets │ ├Microsoft.VisualStudio.CodeAnalysis.dll │ └Microsoft.VisualStudio.CodeAnalysis.Sdk.dll ├[Repository] │ │ │ ├[Compatibility] │ │ │ │ │ ├Desktop2.0.xml │ │ ├Desktop2.0SP1.xml │ │ ├Desktop2.0SP2.xml │ │ ├Desktop3.0.xml │ │ ├Desktop3.0SP1.xml │ │ ├Desktop3.0SP2.xml │ │ ├Desktop3.5.xml │ │ └Desktop3.5SP1.xml │ └system32.bin ├[Rules] │ │ │ ├DataflowRules.dll │ ├DesignRules.dll │ ├GlobalizationRules.dll │ ├InteroperabilityRules.dll │ ├MaintainabilityRules.dll │ ├MobilityRules.dll │ ├NamingRules.dll │ ├PerformanceRules.dll │ ├PortabilityRules.dll │ ├ReliabilityRules.dll │ ├SecurityRules.dll │ ├SecurityTransparencyRules.dll │ └UsageRules.dll ├[Xml] │ │ │ ├CodeAnalysisReport.xsl │ ├FxCopReport.xsl │ └VSConsoleOutput.xsl ├Architecture-msil.dll ├CodeAnalysis.dll ├CustomDictionary.xml ├FxCopCmd.exe ├FxCopCmd.exe.config ├FxCopCommon.dll ├FxCopSdk.dll ├Microsoft.Cci.dll ├Microsoft.VisualStudio.CodeAnalysis.Common.dll ├Microsoft.VisualStudio.CodeAnalysis.DataflowModels.dll ├Microsoft.VisualStudio.CodeAnalysis.dll ├Microsoft.VisualStudio.CodeAnalysis.Interop.dll ├Microsoft.VisualStudio.CodeAnalysis.Phoenix.dll ├Microsoft.VisualStudio.CodeAnalysis.Phoenix.xml ├msdia120.dll ├mssp7en.dll ├mssp7en.lex ├phx.dll └Runtime-vccrt-win-msil.dll 

复制它们如下:

  • 整个FxCop安装文件夹的内容

    %programfiles(x86)%\Microsoft Visual Studio 12.0\Team Tools\Static Analysis Tools\FxCop

  • 从Visual Studio 2013 C ++ redist或其他任何地方(也可以参考法律信息 )将msdia120 x86和x64复制到:

    msdia120.dll(874 KiB)

    amd64 \ msdia120.dll(1.07 MiB)

  • 从安装了VS2013的计算机的全局程序集caching( C:\Windows\Microsoft.NET\assembly\GAC_MSIL\_NameOfTheAssembly_\ )中,将以下DLL复制到:(确保DLL版本为12.0!)

    MSBUILD \ Microsoft.VisualStudio.CodeAnalysis.dll

    MSBUILD \ Microsoft.VisualStudio.CodeAnalysis.Sdk.dll

  • %programfiles(x86)%\MSBuild\Microsoft\VisualStudio\v12.0\CodeAnalysis所有文件

    MSBUILD \ fxcoptask.dll

    MSBUILD \ Microsoft.CodeAnalysis.Targets

(此外,您需要适当的Windows(7.1 / 8.1)SDK来构build安装在构build代理上的.net 4.0 / 4.5应用程序)

另外,我们必须调整项目msbuild文件如下:

 <!--Must import code analysis target before importing csharp targets, so that the correct code analysis targets gets imported. --> <Import Project="$(ProjectBuildScriptDir)Custom.CodeAnalysis.targets"/> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets"/> 

这就是我们的Custom.CodeAnalysis.targets包含的内容:

  <PropertyGroup> <!-- Code analysis settings. --> <CodeAnalysisCulture>en-US</CodeAnalysisCulture> <!-- change this so it points to your ruleset or remove it entirely --> <CodeAnalysisRuleSet>$(SourcesDir)Custom.ruleset</CodeAnalysisRuleSet> <!-- this must refer to the source control directory where you copied FxCopCommand.exe (and the rest of the FxCop files and directories...) to --> <CodeAnalysisPath>$(ToolsDir)FxCop\</CodeAnalysisPath> <!-- this must refer to the source control directory where you copied fxcoptask.dll, Microsoft.CodeAnalysis.Targets, Microsoft.VisualStudio.CodeaAnalysis.dll and Microsoft.VisualStudio.CodeaAnalysis.Sdk.dll to --> <CodeAnalysisTargets>$(CodeAnalysisPath)Msbuild\Microsoft.CodeAnalysis.Targets</CodeAnalysisTargets> </PropertyGroup> <!-- configure this according to your wishes --> <PropertyGroup Condition="'$(Configuration)' == 'Release'"> <CodeAnalysisTreatWarningsAsErrors>false</CodeAnalysisTreatWarningsAsErrors> <RunCodeAnalysis>true</RunCodeAnalysis> </PropertyGroup> <!-- Report code analysis results to TeamCity --> <Target Name="ReportCodeAnalysisResults" AfterTargets="RunCodeAnalysis" Condition="'$(RunCodeAnalysis)' == 'true' And '$(IsRunningOnTeamCity)' == 'true'"> <Message Text="##teamcity[importData type='FxCop' path='$(CodeAnalysisLogFile)']" Importance="High" /> </Target> </Project> 

! 对于FxCop 12.0 / VS2013看到这个答案 !

运行FxCop 14.0而不安装Visual Studio 2015

先决条件:

  • MSBuild 14.0 – >安装Microsoft Build Tools 2015
  • 用于Visual Studio 2015 x86的 Visual C ++可再发行组件 (x86版本始终是必需的,具体取决于构buildx64 redist可能也是必需的,如果缺less错误消息,可能会变得模糊,例如System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.VisualStudio.CodeAnalysis.Interop.dll' or one of its dependencies. The specified module could not be found. )。 而不是安装整个redist你也可以单独复制必要的DLL,但在这一点上我不知道哪些是必要的。 找出哪些是完全丢失是非常棘手和耗时的。

取决于你想要build立的:

  • 适当的Windows SDK,例如Windows 10 SDK
  • 适当的.net SDK /目标(.NET Framework 4.6 SDK包含在Windows 10 SDK中)

要添加到源代码pipe理的文件

这些是我必须添加到源代码pipe理的文件:(请认为这可能会违反一些许可协议)

 (source control)\tools\FxCop14 │ ├[Engines] │ │ │ ├IntrospectionAnalysisEngine.dll │ └PhoenixAnalysisEngine.dll ├[Msbuild] │ │ │ ├fxcoptask.dll │ ├Microsoft.CodeAnalysis.Targets │ ├Microsoft.VisualStudio.CodeAnalysis.dll │ └Microsoft.VisualStudio.CodeAnalysis.Sdk.dll ├[Repository] │ │ │ ├[Compatibility] │ │ │ │ │ ├Desktop2.0.xml │ │ ├Desktop2.0SP1.xml │ │ ├Desktop2.0SP2.xml │ │ ├Desktop3.0.xml │ │ ├Desktop3.0SP1.xml │ │ ├Desktop3.0SP2.xml │ │ ├Desktop3.5.xml │ │ └Desktop3.5SP1.xml │ └system32.bin ├[Rules] │ │ │ ├DataflowRules.dll │ ├DesignRules.dll │ ├GlobalizationRules.dll │ ├InteroperabilityRules.dll │ ├MaintainabilityRules.dll │ ├MobilityRules.dll │ ├NamingRules.dll │ ├PerformanceRules.dll │ ├PortabilityRules.dll │ ├ReliabilityRules.dll │ ├SecurityRules.dll │ ├SecurityTransparencyRules.dll │ └UsageRules.dll ├[x64] │ │ │ └msdia140.dll (1349 KB) ├[Xml] │ │ │ ├CodeAnalysisReport.xsl │ ├FxCopReport.xsl │ └VSConsoleOutput.xsl ├Architecture-msil.dll ├CodeAnalysis.dll ├CustomDictionary.xml ├FxCopCmd.exe ├FxCopCmd.exe.config ├FxCopCommon.dll ├FxCopSdk.dll ├Microsoft.Cci.dll ├Microsoft.VisualStudio.CodeAnalysis.Common.dll ├Microsoft.VisualStudio.CodeAnalysis.DataflowModels.dll ├Microsoft.VisualStudio.CodeAnalysis.dll ├Microsoft.VisualStudio.CodeAnalysis.Interop.dll ├Microsoft.VisualStudio.CodeAnalysis.Phoenix.dll ├Microsoft.VisualStudio.CodeAnalysis.Phoenix.xml ├msdia140.dll (1057 KB) ├mssp7en.dll ├mssp7en.lex ├phx.dll └Runtime-vccrt-win-msil.dll 

复制它们如下:

  • 整个FxCop安装文件夹的内容

    %programfiles(x86)%\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\FxCop

  • 从Visual Studio 2015 C ++ redist或任何其他地方:(也请参阅法律信息 )将msdia140 x86和x64复制到:

    msdia140.dll(1057 KiB)

    amd64 \ msdia140.dll(1349 KiB)

  • 从安装了VS2015的计算机的全局程序集caching( C:\Windows\Microsoft.NET\assembly\GAC_MSIL\_NameOfTheAssembly_\ )中,将以下DLL复制到:(确保DLL版本为14.0!)

    MSBUILD \ Microsoft.VisualStudio.CodeAnalysis.dll

    MSBUILD \ Microsoft.VisualStudio.CodeAnalysis.Sdk.dll

  • %programfiles(x86)%\MSBuild\Microsoft\VisualStudio\v14.0\CodeAnalysis所有文件

    MSBUILD \ fxcoptask.dll

    MSBUILD \ Microsoft.CodeAnalysis.Targets

另外我调整了项目msbuild文件(* .csproj),如下所示(提示:我稍微偏离了之前我使用VS2013的方式,这不是因为FxCop 14工作不同,而是因为这样我可以包括fxcop nuget包并使用.targets文件导入到.csproj的标准nugetfunction):

 <!-- Microsoft.CSharp.targets import is contained in csproj by default. This just goes to show the sequence --> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets"/> <!-- now this must be added --> <Import Project="$(ProjectBuildScriptDir)Custom.CodeAnalysis.targets"/> 

这就是我们的Custom.CodeAnalysis.targets包含的内容:

 <?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <!-- Code analysis settings. --> <PropertyGroup> <!-- this must reference the path where you copied the FxCop stuff to --> <FxCopDir>..\FxCop14\</FxCopDir> <CodeAnalysisCulture>en-US</CodeAnalysisCulture> <CodeAnalysisRuleSet>$(SolutionDir)FxCop.ruleset</CodeAnalysisRuleSet> <!-- you can and should use another condition here. Otherwise code analysis will be run on every build in VS as well. --> <!-- in my build setup i do something like Condition=IsRunningOnTeamCity => true --> <RunCodeAnalysis>true</RunCodeAnalysis> <CodeAnalysisTreatWarningsAsErrors Condition="'$(IsRunningOnTeamCity)' != 'true'">true</CodeAnalysisTreatWarningsAsErrors> </PropertyGroup> <Import Project="$(FxCopDir)Msbuild\Microsoft.CodeAnalysis.Targets" /> <Target Name="CodeAnalysisLogHeader" BeforeTargets="RunCodeAnalysis" Condition="$(RunCodeAnalysis) == 'true'"> <Message Text="Text, Executing Code Analysis (FxCop) on $(MsBuildProjectName)" Importance="High" /> </Target> <!-- Report code analysis results to TeamCity --> <Target Name="ReportCodeAnalysisResults" AfterTargets="RunCodeAnalysis" Condition="$(RunCodeAnalysis) == 'true' AND '$(IsRunningOnTeamCity)' == 'true'"> <Message Text="##teamcity[importData type='FxCop' path='$(MSBuildProjectDirectory)\$(CodeAnalysisLogFile)']" Importance="High" /> </Target> </Project> 

在不安装Visual Studio的情况下使用FxCop进行SonarQube分析

如果您在SonarQube质量configuration文件中启用了任何FxCop规则,则SonarQube需要FxCop 14.0。

这些步骤主要基于@BatteryBackupUnit的出色答案 :

  1. 在生成机器上安装Microsoft Build Tools 2015 。

  2. 在生成机器上安装Microsoft Visual C ++ 2015 Redistributable Update 3 ,x86和x64。

  3. 导入以下registry文件(更新驱动器号如果不是C :)在生成计算机上:

 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WDExpress\14.0\Setup\EDev] "StanDir"="C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Team Tools\\Static Analysis Tools\\" "FxCopDir"="C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Team Tools\\Static Analysis Tools\\FxCop\\" 
  1. 将所有%programfiles(x86)%\Microsoft Visual Studio 12.0\Team Tools\Static Analysis Tools (不仅仅是FxCop子目录)复制到生成机器上的相同位置。

  2. %programfiles(x86)%\MSBuild\Microsoft\VisualStudio\v14.0\CodeAnalysis到生成机器上的相同位置。

  3. 从装有VS2015的计算机的全局程序集caching(C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSIL_NameOfTheAssembly_)中,复制Microsoft.VisualStudio.CodeAnalysis.dllMicrosoft.VisualStudio.CodeAnalysis.Sdk.dll (确保DLLs是版本14.0!)。 复制到生成机器上的C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\CodeAnalysis ,或者安装到生成机器的GAC中。

@ BatteryBackupUnit指令的偏差:

  1. 整个Static Analysis Tools目录是必需的,而不仅仅是FxCop子目录。
  2. 而不是在FxCop下嵌套一个Msbuild子文件夹,您需要将它放在原始位置。
  3. 只要安装了Visual C ++ 2015 Redistributable,将msdia120.dllamd64\msdia140.dll文件复制到FxCop目录似乎是不必要的。
  4. 对项目文件(* .csproj)没有FxCop相关的修改。
  5. 没有Custom.CodeAnalysis.targets文件。

TFS有一个非常简单的方法:

在生成机器上,添加一个环境variables: FXCOPDIR ,将其指向: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Team Tools\Static Analysis Tools\FxCop (只需从开发机器复制该文件夹)。

在这个目录中有一个名为: FxCopCmd.exe的文件,即使没有安装vs,TFS Build也会自动提取。 您可能需要重新启动服务器一次或两次,但生成最终将工作。 你还需要确保两个dll安装到gac:Microsoft.VisualStudio.CodeAnalysis.dll和Microsoft.VisualStudio.CodeAnalysis.Sdk.dll第一个可以在上面提到的path中find,但是后者只有这样,我抓住了它是从我的开发机器上的gac抓住它。 (你可以禁用特殊的gac文件夹视图,通过修改registry,只是谷歌它)。