我将在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,但无法理解如何使用它来分别获取每个项目的日志文件。
这是正确的做法吗? 任何人都可以建议一些更好的解决方案,可以为每个项目提供单独的日志记录吗?
答案 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项目并构建它们。您将在每个项目的放置位置获取一个日志文件。