2012-09-10 15 views
7

我正在嘗試在TFS的TEST安裝中設置/覆蓋一些設置,以強制代碼分析和生成過程中的相關設置(不管項目文件的設置如何)在TFSBuild.proj中設置代碼分析設置

目前,我們在我們的測試TFS安裝使用:

  • 的Visual Studio 2012最終在我們的開發機器和構建服務器
  • 有TFS 2012一臺服務器上安裝(應用程序和數據層)
  • 已安裝在另一臺服務器

我們可以編譯樣本.NET 4.5的項目(類庫(DLL),web應用等)的預期TFS 2012生成服務(控制器和代理)。這僅僅是爲了覆蓋相關的代碼分析設置(希望)。

場景1 - 在我們的開發人員機器上的示例應用程序中,當您選擇項目設置(右鍵單擊 - >解決方案資源管理器中的屬性)時,如果打開「啓用代碼分析」並從下拉列表中選擇一個規則集會執行,因此它會生成一些警告。如果在記事本中打開,此技術將<RunCodeAnalysis>false</RunCodeAnalysis>添加到* .csproj文件。如果構建被執行以編譯示例項目/解決方案,則代碼分析按預期執行。我不想在每個項目上這樣做,因爲開發人員可以關閉它(儘管我希望有辦理登機手續的政策和/或私人/門控簽到以及強制這一點)。我們可以在我們的TFSBuild.proj文件中禁用「啓用代碼分析生成」複選框並強制代碼分析(我們(將)使用默認的upgradetemplate.xaml作爲流程定義,因爲我們將從2008 TFS在我們的LIVE TFS安裝)具有:

<RunCodeAnalysis>Always</RunCodeAnalysis>

這個工作,這是我們如何將迫使(教訓仍然需要學習:-))代碼分析我們建立。

當設置其他assosicated代碼分析設置時,問題就出現了。例如,將哪些默認規則集應用/使用或將CA警告視爲錯誤。其中一些設置可以通過在記事本中編輯* .csproj在VS中或全部設置。如果我編輯* .csproj,那麼這些值將在構建中按預期使用(以及在開發人員計算機上的本地)。這並不理想,因爲我想在TFSBuild.proj中集中執行,而不必編輯每個項目文件。我相信我可以使用設置,如在我TFSbuild.proj文件:

<PropertyGroup> 
    <RunCodeAnalysis>Always</RunCodeAnalysis> 
    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> 
    <CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors> 
</PropertyGroup> 

但他們似乎沒有工作,或者我把它們放錯了地方?我如何修復/正確使用它們?

FYI我通過建立我在TFSBuild.proj解決方案:

<Project DefaultTargets="DesktopBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 

    <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets" /> 
      <ItemGroup> 
      <SolutionToBuild Include="/some folder/some solution.sln" /> 
      <ConfigurationToBuild Include="Debug|Any CPU"> 
       <FlavorToBuild>Debug</FlavorToBuild> 
       <PlatformToBuild>Any CPU</PlatformToBuild> 
      </ConfigurationToBuild> 
      </ItemGroup> 
</Project> 

在構建服務器我確實發現在C基準爲代碼分析目標文件:\程序文件(x86)\的MSBuild \微軟\ VisualStudio \ v11.0 \ CodeAnalysis,但我不想更改構建服務器上的默認行爲(儘管它在我這樣做時可以工作)。例如CodeAnalysisTreatWarningsAsErrors的條件必須被評估爲false。它就像我的值不是從TFSBuild.proj中讀取的,而是從.csproj文件中讀取的。

任何問題隨時問和提前

回答

1

我記得有一個類似的問題,謝謝 - 但沒有對其進行調查的時候,我的工作圍繞它通過調用的FxCop直接使用exec任務。我只給你一些亮點,省略一些屬性的說明,我希望名稱清楚。

我創建了一個的ItemGroup輸出的dll,FilesToAnalyze,並以類似的方式餵給的FxCop:

<PropertyGroup> 
     <FxCopErrorLinePattern>: error</FxCopErrorLinePattern> 
     <FxCopCommand>"$(FxCopPath)" /gac /rule:"$(FxCopRules)" /ruleset:="$(FxCopRuleSet)" @(FilesToAnalyze->'/file:"%(identity)"', ' ') /out:$(FullFxCopLog) /console | Find "$(FxCopErrorLinePattern)" > "$(FxCopLogFile)"</FxCopCommand> 
</PropertyGroup>  

<Exec Command="$(FxCopCommand)" 
     ContinueOnError="true"> 
    <Output TaskParameter="ExitCode" PropertyName="FxCopExitCode"/> 
</Exec> 

<ReadLinesFromFile File="$(FxCopLogFile)"> 
    <Output TaskParameter="Lines" ItemName="AllErrorLines"/> 
</ReadLinesFromFile> 

然後我可以使用extensionpack任務確定輸出的錯誤數量:

<MSBuild.ExtensionPack.Framework.MsBuildHelper TaskAction="GetItemCount" InputItems1="@(AllErrorLines)"> 
    <Output TaskParameter="ItemCount" PropertyName="FxErrorCount"/> 
</MSBuild.ExtensionPack.Framework.MsBuildHelper> 

,併爲每一個錯誤失敗構建步驟:

<BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
     BuildUri="$(BuildUri)" 
     Id="$(FxCopStep)" 
     Status="Failed" 
     Message="FxCop Failed: $(FxErrorCount) errors."/> 

<BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
       BuildUri="$(BuildUri)" 
       Status="Failed" 
       Message="%(AllErrorLines.Identity)"/> 

通過這種方式在構建服務器上執行代碼分析,我們也避免了必須分別配置每個項目。我們在一個單獨的.targets文件中隔離了所有這些,因此向解決方案添加代碼分析是導入該文件的一個問題,並且可能通過設置適當的屬性來調整行爲。

0

即使在VS.Net中選中了「對代碼進行代碼分析(定義CODE_ANALYSIS常量)」,我也有類似的問題,即Cruise Control沒有使用CODE_ANALYSIS編譯符號編譯。

看起來無論是檢查與否,CODE_ANALYSIS其實並沒有明確地添加到編譯符號中的csproj列表(即使它出現在文本框中輸入「條件編譯符號」),只有<RunCodeAnalysis>true</RunCodeAnalysis>加入。

當通過VS.Net進行編譯時,CODE_ANALYSIS會自動添加,但不會在使用MSBuild時使用,這是Cruise Control使用的。

我最終將VS.Net中的「條件編譯符號」從「CODE_ANALYSIS; MySymbol」更改爲「MySymbol; CODE_ANALYSIS」。這樣做迫使CODE_ANALYSIS也出現在csproj中。