Dot-Net

在建構代理上執行程式碼分析 (FxCop > 10) 而不安裝 Visual Studio

  • February 12, 2014

在 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 版本有多個有效答案,我冒昧地將它們連結到此處以便於訪問:

在不安裝 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: 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)或任何其他地點:(另見法律資訊)將 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。歡迎指正:-)

對於FxCop 14.0** / VS2015 看到這個答案**


在不安裝 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 或任何其他地方:(另請參閱法律資訊)將 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>

引用自:https://stackoverflow.com/questions/21729066