Подтвердить что ты не робот

Анализ кода выполнения (FxCop 12.0/14.0) в агенте сборки без установки Visual Studio 2013/2015

После того, как FxCop 10 Microsoft прекратила доставку отдельного установщика для FxCop. Официально в настоящее время можно выполнить только анализ кода (FxCop 12.0/14.0) после установки Visual Studio 2013/2015. Тем не менее, мы категорически заявляем, что не устанавливаем Visual Studio в агенты сборки (необходимо, чтобы установка была синхронизирована с тем, что мы получили на компьютерах разработчиков и т.д.).

Итак, как я мог бы заставить FxCop 12.0/14.0 работать с агентом сборки, желательно, не устанавливая ничего другого? Тем не менее, я бы согласился добавить несколько двоичных файлов и файлов msbuild в исходный элемент управления. В противном случае: существует ли способ установить материал FxCop с помощью установщика Visual Studio 2013/2015?

Примечание: мы используем Teamcity как сервер сборки.

4b9b3361

Ответ 1

!! Для FxCop 12.0/VS2013 см. этот ответ!!

Запустите FxCop 14.0 без установки Visual Studio 2015

Предпосылки:

  • MSBuild 14.0 → Установить Microsoft Build Tools 2015
  • Visual С++ Redistributable для Visual Studio 2015 x86 (всегда требуется версия x86, в зависимости от сборки Может потребоваться также redist x64. Если он отсутствует, сообщение об ошибке может быть загадочным, например 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/target (SDK.NET Framework 4.6 включен в SDK Windows 10)

Файлы для добавления в исходное управление

Это файлы, которые я должен был добавить в исходный элемент управления: (Пожалуйста, учтите, что это может нарушить некоторые лицензионные соглашения)

(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 С++ redist или любого другого места: (также см. юридическая информация) скопируйте msdia140 x86 и x64 в:

    msdia140.dll(1057 KiB)

    amd64\msdia140.dll(1349 KiB)

  • из глобального сборочного кэша (C:\Windows\Microsoft.NET\assembly\GAC_MSIL\_NameOfTheAssembly_\) компьютера, на котором установлен VS2015, скопируйте следующие 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 15.0/Visual Studio 2017:

Исходные каталоги несколько изменились.

Файлы FxCop можно скопировать из:

% programfiles (x86)%\Microsoft Visual Studio\2017\ ИЗОБРАЖЕНИЕ INSERT ЗДЕСЬ\Инструменты команды\Инструменты статического анализа \FxCop

Файлы, которые нужно скопировать в папку MSBUILD, можно получить из:

% programfiles (x86)%\Microsoft Visual Studio\2017\ ИЗОБРАЖЕНИЕ INSERT ЗДЕСЬ\MSBuild\Microsoft\VisualStudio\v15.0\CodeAnalysis

(Издание: Professional/Enterprise. Возможно, сообщество, но AFAIR, имеет совсем другой путь).

Ответ 2

!! Для FxCop 14.0/VS2015 см. этот ответ!!

Запустите FxCop 12.0 без установки Visual Studio 2013

Хорошо, я вложил 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 С++ redist или любого другого места: (также см. юридическая информация) скопируйте msdia120 x86 и x64 в:

    msdia120.dll(874 KiB)

    amd64\msdia120.dll(1.07 MiB)

  • из глобального сборочного кэша (C:\Windows\Microsoft.NET\assembly\GAC_MSIL\_NameOfTheAssembly_\) компьютера, на котором установлен VS2013, скопируйте следующие 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

(Кроме того, вам нужен соответствующий SDK Windows (7.1/8.1) для создания приложения .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>

Ответ 3

Использование FxCop для анализа SonarQube без установки Visual Studio

Если у вас есть какие-либо правила FxCop, включенные в ваш профиль качества SonarQube, SonarQube требует FxCop 14.0.

Эти шаги в основном основаны на выдающемся ответе на @BatteryBackupUnit:


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\\"
  1. Скопируйте все %programfiles(x86)%\Microsoft Visual Studio 12.0\Team Tools\Static Analysis Tools (а не только подкаталог FxCop) в одно и то же место на машине сборки.

  2. Скопируйте %programfiles(x86)%\MSBuild\Microsoft\VisualStudio\v14.0\CodeAnalysis в одно и то же место на машине сборки.

  3. Из глобального сборочного кэша (C:\Windows\Microsoft.NET\assembly\GAC_MSIL_NameOfTheAssembly_) компьютера, на котором установлен VS2015, скопируйте Microsoft.VisualStudio.CodeAnalysis.dll и Microsoft.VisualStudio.CodeAnalysis.Sdk.dll (убедитесь, что библиотеки DLL версии 14.0!). Либо скопируйте его на C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\CodeAnalysis на машине сборки, либо установите в машину сборки GAC.

Отклонения от инструкций @BatteryBackupUnit:

  • Требуется весь каталог Static Analysis Tools, а не только подкаталог FxCop.
  • Вместо того, чтобы вставлять подпапку Msbuild под FxCop, вам нужно поместить ее в исходное местоположение.
  • Копирование msdia120.dll и amd64\msdia140.dll файлов в каталог FxCop кажется ненужным до тех пор, пока не будет установлен Redistributable Visual С++ 2015.
  • Отсутствие изменений, связанных с FxCop, в файле проекта (*.csproj).
  • Нет Custom.CodeAnalysis.targets.

Ответ 4

Там очень простой способ для TFS:

На машине сборки добавьте переменную среды: FXCOPDIR, укажите ее на: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Team Tools\Static Analysis Tools\FxCop (просто скопируйте эту папку с вашей машины).

В этом каталоге есть файл под названием: FxCopCmd.exe и TFS Build автоматически подберет его, даже если vs не установлен. Возможно, вам потребуется перезагрузить сервер один или два раза, но сборка в конечном итоге будет работать. Вам также необходимо убедиться, что в gac установлены две библиотеки dll: Microsoft.VisualStudio.CodeAnalysis.dll и Microsoft.VisualStudio.CodeAnalysis.Sdk.dll Первый из них можно найти по указанному выше пути, но последний, единственный способ, которым я его удержал, - это то, что я схватил его из gac на моей машине dev. (вы можете отключить специальное представление папки gac, изменив реестр, просто перейдите в Google).