2013-04-08 12 views
12

sto creando un file MSBuild per combinare alcuni compiti delle cose che devo fare sul mio server di build in un solo passo. Parte di questo processo richiede l'analisi del codice in esecuzione. Il mio problema è che ho eseguito l'analisi del codice per più progetti di primo livello, ma ognuno di essi ha le stesse dipendenze da altri progetti come la nostra libreria di utilità. Ciò significa che ogni analisi di codice duplica un ciclo di analisi del codice della libreria di utilità. Ecco il mio file di MSBuild:MSBuild file per eseguire analisi del codice senza sovrapposizione

<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> 

Qualsiasi idea di come evitare che l'analisi del codice l'esecuzione sullo stesso gruppo di più di una volta in questa situazione?

+0

avete veramente bisogno di eseguire il codice di analisi ogni volta che fate una generazione? Di solito lo eseguo su file binari compilati poiché rallenterebbe davvero il build e dubito che debba essere eseguito più frequentemente rispetto al giorno. –

+0

Eseguo l'analisi del codice ogni volta che vengono generate dev (ogni due ore se ci sono modifiche al codice) perché vogliamo essere avvisati quando abbiamo bisogno di correggere il nostro codice. Se lo cambio dovrei modificare il mio setup in modo da avere un piano per eseguire l'analisi del codice ogni ora e uno per creare dev ogni due ore. – Chris

+4

Puoi eseguire la build con/v: diag e cercare questa linea: "Target" RunCodeAnalysis: 'dovrebbe mostrare sulle prossime due righe cosa fosse Input e cosa fosse l'Output. Se pulisci la cartella di build potresti mantenere il '* .lastcodeanalysissucceeded', che in giro perché determinano se il bersaglio è out-of-date. – rene

risposta

1

Di solito, corro strumento a riga di comando di analisi del codice, dopo "l'imballaggio" la mia distribuzione binaria. MSBuildCodeMetrics è un progetto "embrione" per l'esecuzione di metriche all'interno di build.

L'idea è quella di rompere la build se qualche utente si impegna un metodo con troppe linee o con troppi ciclomatica complessità, ma il progetto non è con questa maturità ancora.

In ogni caso, se si desidera eseguire le metriche attraverso la linea di comando, provare:

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

Naturalmente avrete bisogno di un po 'di magia per copiare tutti i gruppi ad una directory temporanea (come il pacchetto finale) e quindi eseguire le metriche basate su questa directory.

Problemi correlati