在构建代理上运行代码分析 (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,就像这样:<ItemGroup> <FxCopLibs Include="$(MSBuildThisFileDirectory)lib\**\*.*" /> </ItemGroup> <Exec Command="vc_redist.x86.exe /q /norestart" WorkingDirectory="$(FxCopFolder)" />
按照上述步骤操作后无法正常工作。我没有使用 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.dll
和 Microsoft.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.dll
和 amd64\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 代码分析吗?