2014-07-22 18 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。你有什么好的链接来得到一个快速的想法?谢谢 –