2014-07-22 47 views
0

我要在TFS上構建大量(300多個)項目。我正在考慮一個凸出的文件來管理這些如下:TFS和MSBuild項目每個項目的日誌記錄

<ItemGroup Label="GGX_Projects" > 
<MyProj Include="$(Source)Proj1.vcxproj" /> 
<MyProj Include="$(Source)Proj2.vcxproj" /> 
<MyProj Include="$(Source)Proj3.csproj" /> 
<MyProj Include="$(Source)Proj4.csproj" /> 
<MyProj Include="$(Source)Proj5.vcxproj" /> 

<MSBuild Projects="@(MyProj)" 
     Targets="ReBuid" 
     Properties="Configuration='$(Configuration)'" 
     RebaseOutputs="true" 
     ContinueOnError="true" 
/> 

這實際工作正常,但有一件事我無法做到即獲取ItemGroup中提到的每個項目的日誌。

我需要單獨的日誌,以便如果任何項目失敗,該日誌可以通過電子郵件發送。

另外,在msbuild命令行上,我嘗試了/ distributeFileLogger,但無法理解如何使用它來單獨獲取每個項目的日誌文件。

這是一個正確的方法嗎? 任何人都可以請建議一些更好的解決方案,可以爲每個項目提供單獨的日誌記錄?

回答

1

顧名思義,分佈式文件記錄器是用於從「分佈式」構建系統中記錄單個MSBuild節點,而不是從單個項目,目標或任務進行記錄。你可以嘗試創建一個簡單的自定義記錄器,這是相當微不足道的,我已經寫了下面的示例。雖然,您可能需要使用冗長的事件類型並使用諸如NLog之類的東西,而不是附加到文件,因爲您可能會鎖定。

msbuild PerProjectLogger.sln /logger:PerProjectLogger\bin\Debug\PerProjectLogger.dll

using System.Collections.Concurrent; 
using System.IO; 
using Microsoft.Build.Framework; 

namespace PerProjectLogger 
{ 
    public class Logger : Microsoft.Build.Utilities.Logger 
    { 
     public override void Initialize(IEventSource eventSource) 
     { 
      var loggers = new ConcurrentDictionary<string, FileInfo>(); 

      eventSource.AnyEventRaised += (s, a) => 
      { 
       var property = a.GetType().GetProperty("ProjectFile"); 
       if (property == null) 
        return; 

       var project = property.GetValue(a) as string; 
       if (project == null) 
        return; 

       var logger = loggers.GetOrAdd(Path.GetFileName(project), name => new FileInfo(name + ".log")); 
       using (var writer = logger.AppendText()) 
        writer.WriteLine(a.Message); 
      }; 
     } 
    } 
} 
+0

代碼+1。我一定會嘗試這個。仍然在尋找其他一些技術...... –

+0

如果TFS具有類似的內置內容,您是否有任何信息?我正在處理300多個項目。 –

+0

@FarrukhWheheed不知道,我不太熟悉TFS的ALM的構建部分。無論如何,我個人的理念是你在CLI中應該能夠做的任何事情,例如,作爲本地開發人員(飛機場景中經典的離線筆記本電腦),作爲遠程​​調試的開發人員等。CI的工作正在醞釀,並觸發構建/部署腳本,完成它需要做的所有事情,並與之一起版本化VCS中的代碼本身,所以依賴於只有TFS可以做但不是本地MSBuild的東西,我不推薦[親自]。 –

0

與TFS實現這一目標的最簡單的方法是創建一個單一的構建拘留,然後在進程選項卡上,你應該看到一個選項來接解決方案來構建。在這裏你可以單獨添加每個項目。當你做一個構建時,默認構建過程將執行一個foreach項目並構建它們。您將在每個項目的放置位置獲得一個日誌文件。

+0

這將是最後一個動作。想象一下,在TF中添加300多個項目。 –

+0

你可以通過API來做到這一點,所以只需腳本從PowerShell添加... –

+0

這是一個不錯的主意。但必須探索TFS API。你有什麼好的鏈接來得到一個快速的想法?謝謝 –