在建構代理上執行程式碼分析 (FxCop > 10) 而不安裝 Visual Studio
在 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>