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

Файл MSBuild для выполнения анализа кода без перекрытия

Я создаю файл MSBuild, чтобы объединить некоторые задачи, которые мне нужно сделать на моем сервере сборки, в один шаг. Часть этого процесса требует анализа кода. Моя проблема в том, что у меня есть анализ кода для нескольких проектов верхнего уровня, но каждый из них имеет одинаковые зависимости от других проектов, таких как наша библиотека Utility. Это означает, что каждый запуск анализа кода дублирует выполнение анализа кода библиотеки Utility. Вот мой файл MSBuild:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
    <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Dev</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
        <RunCodeAnalysis>true</RunCodeAnalysis>
        <CodeAnalysisTargets>C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\CodeAnalysis\Microsoft.CodeAnalysis.targets</CodeAnalysisTargets>
        <CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
        <StyleCopTreatErrorsAsWarnings>false</StyleCopTreatErrorsAsWarnings>
        <DefineConstants>TRACE;DEBUG;CODE_ANALYSIS</DefineConstants>
        <BuildInParallel>true</BuildInParallel>
        <WebProjectTargets>Clean;Build;Package</WebProjectTargets>
        <OtherProjectTargets>Clean;Build</OtherProjectTargets>
        <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
    </PropertyGroup>

    <Target Name="Build">
        <!-- Web Projects -->
        <MSBuild
            Projects="$(MSBuildProjectDirectory)\Source\WebProjects\WebApp1\WebApp1.csproj"
            Properties="
                Configuration=$(Configuration);
                PackageLocation=$(MSBuildProjectDirectory)\Packages\WebApp1.zip;
                RunCodeAnalysis=$(RunCodeAnalysis);
                CodeAnalysisTargets=$(CodeAnalysisTargets);
                CodeAnalysisTreatWarningsAsErrors=$(CodeAnalysisTreatWarningsAsErrors);
                StyleCopTreatErrorsAsWarnings=$(StyleCopTreatErrorsAsWarnings);
                DefineConstants=$(DefineConstants);
                BuildInParallel=$(BuildInParallel);
                GenerateSerializationAssemblies=$(GenerateSerializationAssemblies);
                "
            Targets="$(WebProjectTargets)" />
        <MSBuild
            Projects="$(MSBuildProjectDirectory)\Source\WebProjects\WebApp2\WebApp2.csproj"
            Properties="
                Configuration=$(Configuration);
                PackageLocation=$(MSBuildProjectDirectory)\Packages\WebApp2.zip;
                RunCodeAnalysis=$(RunCodeAnalysis);
                CodeAnalysisTargets=$(CodeAnalysisTargets);
                CodeAnalysisTreatWarningsAsErrors=$(CodeAnalysisTreatWarningsAsErrors);
                StyleCopTreatErrorsAsWarnings=$(StyleCopTreatErrorsAsWarnings);
                DefineConstants=$(DefineConstants);
                BuildInParallel=$(BuildInParallel);
                GenerateSerializationAssemblies=$(GenerateSerializationAssemblies);
                "
            Targets="$(WebProjectTargets)" />
        <MSBuild
            Projects="$(MSBuildProjectDirectory)\Source\WebProjects\Administrator\Administrator.csproj"
            Properties="
                Configuration=$(Configuration);
                PackageLocation=$(MSBuildProjectDirectory)\Packages\Administrator.zip;
                RunCodeAnalysis=$(RunCodeAnalysis);
                CodeAnalysisTargets=$(CodeAnalysisTargets);
                CodeAnalysisTreatWarningsAsErrors=$(CodeAnalysisTreatWarningsAsErrors);
                StyleCopTreatErrorsAsWarnings=$(StyleCopTreatErrorsAsWarnings);
                DefineConstants=$(DefineConstants);
                BuildInParallel=$(BuildInParallel);
                GenerateSerializationAssemblies=$(GenerateSerializationAssemblies);
                "
            Targets="$(WebProjectTargets)" />
        <MSBuild
            Projects="$(MSBuildProjectDirectory)\Source\OtherProjects\Service\Service.csproj"
            Properties="
                Configuration=$(Configuration);
                RunCodeAnalysis=$(RunCodeAnalysis);
                CodeAnalysisTargets=$(CodeAnalysisTargets);
                CodeAnalysisTreatWarningsAsErrors=$(CodeAnalysisTreatWarningsAsErrors);
                StyleCopTreatErrorsAsWarnings=$(StyleCopTreatErrorsAsWarnings);
                DefineConstants=$(DefineConstants);
                BuildInParallel=$(BuildInParallel);
                GenerateSerializationAssemblies=$(GenerateSerializationAssemblies);
                "
            Targets="$(OtherProjectTargets)" />
    </Target>
</Project>

Любая идея о том, как предотвратить анализ кода из одной и той же сборки более одной раз в этой ситуации?

4b9b3361

Ответ 1

Обычно я запускаю инструмент командной строки анализа кода после "упаковки" моего двоичного дистрибутива. MSBuildCodeMetrics является проектом "эмбриона" для выполнения показателей внутри сборки.

Идея состоит в том, чтобы разбить сборку, если какой-то пользователь совершает метод со слишком большим количеством строк или со слишком большим количеством циклических сложностей, но проект еще не с этой зрелостью.

В любом случае, если вы хотите запустить метрики через командную строку, попробуйте:

http://msdn.microsoft.com/en-us/library/bb385914.aspx

Конечно, вам понадобится волшебство, чтобы скопировать все сборки в временный каталог (например, ваш окончательный пакет), а затем запустите метрики на основе этого каталога.