用户登录
用户注册

分享至

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

  • 作者: 逛窑子的小男孩
  • 来源: 51数据库
  • 2023-02-13

问题描述

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

After FxCop 10 Microsoft stopped shipping a separate installer for FxCop. Officially one can currently only run code analysis (FxCop 12.0 / 14.0 / 15.0) after installing Visual Studio 2013 / 2015 / 2017. However, we are adamant about not installing Visual Studio on the build agents (the installation needs then to be kept in-sync with what we have got on the developer computers etc.).

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

So how would i go about getting FxCop 12.0 / 14.0 / 15.0 to work on a build agent, preferrably without installing anything else? I would accept adding a few binaries and msbuild files to source control, though. Otherwise: Is there a way to only install the FxCop stuff using Visual Studio 2013 / 2015 / 2017 installer?

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

Note: we are using Teamcity as build server.

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

As there are multiple valid answers for specific environments and FxCop versions, I've taken the liberty of linking them here for easier access:

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

推荐答案

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

先决条件:

  • MSBuild 15.0 --> 安装 Microsoft Build Tools 2017,您可能还想查看此处
  • Visual C++ Redistributable for Visual Studio 2017 x86或这里 带有 C++ 的 Visual Studio 2017.---- 注意:总是需要 x86 版本,根据构建,可能还需要 x64 redist.如果它丢失,则错误消息可能很神秘,例如 System.IO.FileNotFoundException: 无法加载文件或程序集 'Microsoft.VisualStudio.CodeAnalysis.Interop.dll' 或其依赖项之一.找不到指定的模块.).除了安装整个 redist,您还可以单独复制必要的 DLL,但此时我不知道需要哪些.找出确切缺失的部分非常棘手且耗时.
  • MSBuild 15.0 --> Install Microsoft Build Tools 2017, you might also want to see here
  • Visual C++ Redistributable for Visual Studio 2017 x86 or here OR Visual Studio 2017 with C++. ---- Note: the x86 version is always required, depending on the build x64 redist may be required as well. If it is missing the error message can be cryptic, for example 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.). Instead of installing the entire redist you could also copy the necessary DLLs separately, but at this point i don't know which are needed. It's quite tricky and time consuming to find out which ones are exactly missing.

取决于您要构建的内容:

Depending on what you want to build:

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

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

These are the files that i had to add to source control: (Please consider that this might violate some license agreements)

(source control)	oolsFxCop15
│
├[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 安装文件夹内容来自

  • entire FxCop installation folder contents from

%programfiles(x86)%Microsoft Visual Studio2017 **在此处插入版本** Team ToolsStatic Analysis ToolsFxCop

来自 Visual Studio 2017 C++ redist(或您的 Visual Studio 2017 安装,如果您已安装 VC++ 工作负载:%ProgramFiles(x86)%Microsoft Visual Studio2017\VCRedistMSVC14.12.25810) 或任何其他地方:(另请参阅法律信息)复制 msdia140 x86 和 x64 (我的版本是 14.12.25810.0) 到:

from Visual Studio 2017 C++ redist (or your Visual Studio 2017 Installation, if you've got VC++ workload installed: %ProgramFiles(x86)%Microsoft Visual Studio2017\VCRedistMSVC14.12.25810) or any other place: (also see legal information) copy msdia140 x86 and x64 (mine have the version 14.12.25810.0) to:

msdia140.dll (1.12 MiB)

msdia140.dll (1.12 MiB)

amd64msdia140.dll (1.42 MiB)

amd64msdia140.dll (1.42 MiB)

所有文件从 %programfiles(x86)%\Microsoft Visual Studio2017 **INSERT EDITION HERE** MSBuildMicrosoftVisualStudiov15.0CodeAnalysis 到

Msbuildfxcoptask.dll

Msbuildfxcoptask.dll

MsbuildMicrosoft.CodeAnalysis.Targets

MsbuildMicrosoft.CodeAnalysis.Targets

MsbuildMicrosoft.VisualStudio.CodeAnalysis.dll

MsbuildMicrosoft.VisualStudio.CodeAnalysis.dll

MsbuildMicrosoft.VisualStudio.CodeAnalysis.Sdk.dll

MsbuildMicrosoft.VisualStudio.CodeAnalysis.Sdk.dll

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

Additionally i adjusted the project msbuild file (*.csproj) as follows:

<!-- 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 包含的内容:

And this is what our Custom.CodeAnalysis.targets contains:

<?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)MsbuildMicrosoft.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.欢迎指正:-)

Notes for Visual Studio Paths:

The path to the visual studio installation is edition dependent. It includes Professional and Enterprise. AFAIR the community edition has a different path, but also does not support FxCop. Corrections welcome :-)

软件
前端设计
程序设计
Java相关