2013-04-08 2 views
12

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

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

+0

Вам действительно нужно запускать анализ кода каждый раз, когда вы делаете сборку? Я обычно запускаю его на встроенных двоичных файлах, так как он действительно замедлит сборку, и я сомневаюсь, что она должна запускаться чаще, чем ежедневно. –

+0

Я запускаю анализ кода каждый раз, когда dev строит (каждые два часа, если есть изменения в коде), поскольку мы хотим получать уведомления, когда нам нужно исправить наш код. Если я изменю это, я бы изменил мою настройку, поэтому у меня есть один план для запуска анализа кода каждый час, а один - для сборки dev каждые два часа. – Chris

+4

Можете ли вы запустить сборку с помощью/v: diag и вывести эту строку: «Целевой» RunCodeAnalysis: 'он должен показать на следующих двух строках, что такое Input и что такое Output. Если вы очистите папку сборки, вы можете сохраняйте '* .lastcodeanalississceeded', потому что они определяют, является ли цель устаревшей. – rene

ответ

1

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

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

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

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

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

Смежные вопросы