TFS和MSBuild项目记录每个项目

时间:2014-07-22 08:34:44

标签: visual-studio-2012 tfs msbuild

我将在TFS上构建大量(300+)项目。我正在考虑使用proj文件来管理这些文件,如下所示:

<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中提到的每个项目的Log。

我需要单独的日志,因此如果任何项目失败,可以通过电子邮件发送该日志。

另外,在msbuild命令行上,我尝试/ distributedFileLogger,但无法理解如何使用它来分别获取每个项目的日志文件。

这是正确的做法吗? 任何人都可以建议一些更好的解决方案,可以为每个项目提供单独的日志记录吗?

2 个答案:

答案 0 :(得分:1)

分布式文件记录器,顾名思义,用于记录&#34;分布式&#34;中的各个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);
            };
        }
    }
}

答案 1 :(得分:0)

使用TFS实现此目的的最简单方法是创建单个构建滞留,然后在“流程”选项卡上,您应该看到选择要构建的解决方案的选项。在这里,您可以单独添加每个项目。在进行构建时,默认构建过程将执行foreach项目并构建它们。您将在每个项目的放置位置获取一个日志文件。