在构建代理上运行代码分析 (FxCop > 10) 而不安装 Visual Studio

Posted

技术标签:

【中文标题】在构建代理上运行代码分析 (FxCop > 10) 而不安装 Visual Studio【英文标题】:Running Code Analysis (FxCop > 10) on build agent without installing Visual Studio 【发布时间】:2014-03-10 20:17:24 【问题描述】:

在 FxCop 10 之后,Microsoft 停止为 FxCop 提供单独的安装程序。 官方目前只能在安装 Visual Studio 2013 / 2015 / 2017 后运行代码分析(FxCop 12.0 / 14.0 / 15.0)。 但是,我们坚持不要在构建代理上安装 Visual Studio(安装需要与我们在开发人员计算机上获得的内容保持同步等)。

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

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

答案

由于特定环境和 FxCop 版本有多个有效答案,我冒昧地将它们链接到此处以便于访问:

FxCop 15.0 (Visual Studio 2017) FxCop 14.0 (Visual Studio 2015) FxCop 12.0 (Visual Studio 2013) SonarQube

【问题讨论】:

我讨厌任何建议在构建机器上“安装 Visual Studio”的东西。嘘微软。 【参考方案1】:

对于 FxCop 14.0 / VS2015,请参阅 this answer


在不安装 Visual Studio 2013 的情况下运行 FxCop 12.0

好的,我已经投入了 6 个小时,现在它正在工作。 我已将所有必要的可执行文件、dll 和 msbuild 目标添加到源代码控制中。

这些是我必须添加到源代码管理的文件: (请注意这可能违反某些许可协议)

(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 或任何其他地方: (另见legal information)将 msdia120 x86 和 x64 复制到:

msdia120.dll (874 KiB)

amd64\msdia120.dll (1.07 MiB)

从安装了 VS2013 的计算机的全局程序集缓存 (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 来构建安装在构建代理上的 .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>

【讨论】:

感谢分享,非常感谢 我们在构建服务器上收到以下错误:“无法加载文件或程序集 'Microsoft.VisualStudio.CodeAnalysis.Interop.dll' 或其依赖项之一。”即使上面答案中的所有指定文件都已复制。完整的错误信息可以在这里找到:pastebin.com/cJhjHYBZ 解决方案是安装“Visual C++ Redistributable Packages for Visual Studio 2013”​​ @salle55 您能否检查一下您是否已将msdia120.dll 复制到正确的位置和正确的版本(x86 与 x64)?据我所知,这是 VC++ Redist 2013 中唯一需要的 dll。如果您运行 x86,请不要将其复制到 amd64 文件夹。 现在我正在尝试对 FxCop 14(来自 VS2015)做同样的事情,但没有运气。一直收到Could not load file or assembly 'Microsoft.VisualStudio.CodeAnalysis.Interop.dll' or one of its dependencies.。尝试将 .Sdk 安装到 GAC,甚至将 .Interop 安装到 gac - 没有任何帮助。跟踪显示Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.,但如果没有附加调试器,您将无法访问 LoaderExceptions。 @justmara 我怀疑这将需要Visual C++ Redistributable for Visual Studio 2015 的DLL。你能安装它并检查它是否有效吗?还请发回您的结果,以便我更新答案。如果它不起作用,则很可能意味着 FXCop 14 包含更多 dll(也需要复制)。【参考方案2】:

!! 对于 FxCop 12.0 / VS2013,请参阅 this answer !!

在不安装 Visual Studio 2015 的情况下运行 FxCop 14.0

先决条件:

MSBuild 14.0 --> 安装Microsoft Build Tools 2015 Visual C++ Redistributable for Visual Studio 2015 x86(始终需要 x86 版本,具体取决于构建,可能还需要 x64 redist。如果缺少它,则错误消息可能很神秘,例如 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,但此时我不知道需要哪些。找出确切缺失的部分非常棘手且耗时。

取决于您要构建的内容:

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

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

这些是我必须添加到源代码管理的文件: (请注意这可能违反某些许可协议)

(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 或任何其他地方: (另见legal information)将 msdia140 x86 和 x64 复制到:

msdia140.dll (1057 KiB)

amd64\msdia140.dll (1349 KiB)

从安装了 VS2015 的计算机的全局程序集缓存 (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 包并使用标准 nuget 功能将 .targets 文件导入到 .csproj):

<!-- 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>

【讨论】:

是否有人对使用 FxCop 14.0 创建 nuget 包的源代码感兴趣,然后可以将其安装到项目中?由于许可限制,我认为我无法发布包,但我可以发布创建实际包所需的所有代码(然后你必须自己“托管”......) 我最终在构建机器上安装了 vc++ redist。我制作了 .proj 文件,它复制了所有需要的文件并安装了 vc++ redist,就像这样:&lt;ItemGroup&gt; &lt;FxCopLibs Include="$(MSBuildThisFileDirectory)lib\**\*.*" /&gt; &lt;/ItemGroup&gt; &lt;Exec Command="vc_redist.x86.exe /q /norestart" WorkingDirectory="$(FxCopFolder)" /&gt; 按照上述步骤操作后无法正常工作。我没有使用 FxCop msbuild 目标,而是直接调用 FxCopCmd.exe。 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. 有什么想法吗? 找到了,正在安装 vc++ 但它必须是 x86 版本,因为 Microsoft.VisualStudio.CodeAnalysis.Interop.dll 只有 x86。 注意:提供的链接显示 “Visual C++ Redistributable for Visual Studio 2015 x86” 会自动下载 x64 版本。您需要取消自动下载并点击“如果您的下载在30秒后没有开始,请点击这里”,并选择x86版本。【参考方案3】:

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

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

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

    在构建机器上安装Microsoft Build Tools 2015。

    在构建机器上安装 x86 和 x64 的 Microsoft Visual C++ 2015 Redistributable Update 3。

    在构建机器上导入以下注册表文件(如果不是 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\\"

    将所有 %programfiles(x86)%\Microsoft Visual Studio 12.0\Team Tools\Static Analysis Tools(不仅仅是 FxCop 子目录)复制到构建机器上的同一位置。

    %programfiles(x86)%\MSBuild\Microsoft\VisualStudio\v14.0\CodeAnalysis 复制到构建机器上的相同位置。

    从安装了 VS2015 的计算机的全局程序集缓存 (C:\Windows\Microsoft.NET\assembly\GAC_MSIL_NameOfTheAssembly_),复制 Microsoft.VisualStudio.CodeAnalysis.dllMicrosoft.VisualStudio.CodeAnalysis.Sdk.dll(确保 DLL 为 14.0 版! )。要么复制到构建机器上的C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\CodeAnalysis,要么安装到构建机器的GAC中。

如果你在这一切之后看到Phx.FatalError - 还有最后一个仪式...... 从Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Performance Tools\Setups 复制vs_profiler_x64_enu.exe 并将其安装到构建机器上。

与@BatteryBackupUnit 说明的偏差:

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

【讨论】:

这种方法对我有用,只是做了一个改动。最初,代码分析报告错误:“MSBUILD CA0001:抛出了‘Phx.FatalError’类型的异常。”根据this answer,这是由于 msdia140.dll 没有被注册——显然它没有被 VC++ 2015 Redist 安装。从 VS2015 安装中复制 DLL(我使用“C:\Program Files (x86)\Microsoft Visual Studio 14.0\DIA SDK\bin”)并将其注册到 regsvr32 已解决问题。 这对我来说效果很好,但我必须复制“%programfiles(x86)%\Microsoft Visual Studio 14.0\Team Tools\Static Analysis”(14.0 版本不是 12.0)。我也遇到了由缺少 msdia140.dll 引起的“Phx.FatalError”问题【参考方案4】:

在不安装 Visual Studio 2017 的情况下运行 FxCop 15.0

先决条件:

MSBuild 15.0 --> 安装Microsoft Build Tools 2017,您可能还想查看here Visual C++ Redistributable for Visual Studio 2017 x86 或 here 带有 C++ 的 Visual Studio 2017。 ---- 注意:总是需要 x86 版本,根据构建,可能还需要 x64 redist。如果它丢失,则错误消息可能很隐晦,例如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,但此时我不知道需要哪些。找出确切缺失的部分非常棘手且耗时。

取决于您要构建的内容:

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

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

这些是我必须添加到源代码管理的文件: (请注意这可能违反某些许可协议)

(source control)\tools\FxCop15
│
├[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\2017\ **INSERT EDITION HERE** \Team Tools\Static Analysis Tools\FxCop

来自 Visual Studio 2017 C++ redist(或您的 Visual Studio 2017 安装,如果您已安装 VC++ 工作负载:%ProgramFiles(x86)%\Microsoft Visual Studio\2017\\VC\Redist\MSVC\14.12.25810)或任何其他地方: (另见legal information)将 msdia140 x86 和 x64(我的版本为 14.12.25810.0)复制到:

msdia140.dll (1.12 MiB)

amd64\msdia140.dll (1.42 MiB)

%programfiles(x86)%\\Microsoft Visual Studio\2017\ **INSERT EDITION HERE** \MSBuild\Microsoft\VisualStudio\v15.0\CodeAnalysis 到的所有文件

Msbuild\fxcoptask.dll

Msbuild\Microsoft.CodeAnalysis.Targets

Msbuild\Microsoft.VisualStudio.CodeAnalysis.dll

Msbuild\Microsoft.VisualStudio.CodeAnalysis.Sdk.dll

另外我将项目msbuild文件(*.csproj)调整如下:

<!-- 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>..\FxCop15\</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' OR $(RunCodeAnalysisOnce) == 'true'">
        <Message Text="Text, Executing Code Analysis (FxCop) on $(MsBuildProjectName)" Importance="High" />
    </Target>

</Project>

Visual Studio 路径注意事项:

Visual Studio 安装路径取决于版本。它包括专业版和企业版。 AFAIR 社区版有不同的路径,但也不支持 FxCop。欢迎指正:-)

【讨论】:

【参考方案5】:

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

在构建机器上,添加一个环境变量: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 第一个可以在上面提到的路径中找到,但后者,我得到它的唯一方法是我从我的开发机器上的 gac 中抓取它。 (您可以通过修改注册表来禁用特殊的 gac 文件夹视图,只需 google 即可)。

【讨论】:

就在昨天,我查看了Microsoft.CodeAnalysis.targets 文件,发现它使用了$(FxCopDir) 变量。我认为如果你没有运行 TFS,你至少需要在项目中导入这个目标文件。然后代码分析的执行由属性RunCodeAnalysis 控制,并作为Build 目标的“部分”(实际上不是目标之后)完成。 想一想,TFS 不支持开箱即用的静态代码分析(又名 FxCop)吗? 我不确定。我只是想让阅读这篇文章的人知道,与我在几个地方读到的相反,FxCop 不再作为单独的工具提供,并且必须安装 vs 2013,这是不正确的。

以上是关于在构建代理上运行代码分析 (FxCop > 10) 而不安装 Visual Studio的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 代码分析 (fxCop) 仅在第一次构建后运行

可以从 Team Foundation Server 2010 构建代理运行 .NET 4.5 代码分析吗?

代码分析 (FXCop) 命令行差异

在 MVC 网站的静态分析 (FxCop) 中包含 aspx

协助 fxcop

是否可以在未安装 VS 的情况下从 MSBuild 命令行运行 FxCop 代码分析?