Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2012 每个项目的TFS和MSBuild项目日志记录_Visual Studio 2012_Tfs_Msbuild - Fatal编程技术网

Visual studio 2012 每个项目的TFS和MSBuild项目日志记录

Visual studio 2012 每个项目的TFS和MSBuild项目日志记录,visual-studio-2012,tfs,msbuild,Visual Studio 2012,Tfs,Msbuild,我将在TFS上构建大量(300多个)项目。我正在考虑一个项目文件来管理这些文件,如下所示: <ItemGroup Label="GGX_Projects" > <MyProj Include="$(Source)Proj1.vcxproj" /> <MyProj Include="$(Source)Proj2.vcxproj" /> <MyProj Include="$(Source)Proj3.csproj" /> <MyProj I

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

<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"  />


这实际上工作得很好,但有一件事我无法实现,即获取ItemGroup中提到的每个项目的日志

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

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

这是正确的方法吗?
有谁能推荐一些更好的解决方案,为每个项目提供单独的日志记录吗?

分布式文件记录器,顾名思义,用于从“分布式”生成系统中的单个MSBuild节点进行日志记录,而不是从单个项目、目标或任务进行日志记录。您可以尝试创建一个简单的自定义记录器,这相当简单,我在下面编写了一个示例。尽管如此,您可能希望使用事件类型来避免冗长,并使用类似于
NLog
的内容,而不是附加到文件中,因为您可能会得到锁

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

使用System.Collections.Concurrent;
使用System.IO;
使用Microsoft.Build.Framework;
命名空间PerProjectLogger
{
公共类记录器:Microsoft.Build.Utilities.Logger
{
公共覆盖无效初始化(IEventSource eventSource)
{
var loggers=新的ConcurrentDictionary();
eventSource.AnyEventRaised+=(s,a)=>
{
var property=a.GetType().GetProperty(“项目文件”);
if(属性==null)
返回;
var project=property.GetValue(a)作为字符串;
如果(项目==null)
返回;
var logger=loggers.GetOrAdd(Path.GetFileName(项目),name=>newfileinfo(name+“.log”);
使用(var writer=logger.AppendText())
writer.WriteLine(一种信息);
};
}
}
}

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

+1获取代码。我一定要试试这个。仍在搜索其他一些技术…如果TFS有类似的内置功能,您是否有任何信息?我在这里处理300多个项目。@FarrukhWaheed不知道,我对TFS的ALM的构建部分不太熟悉。在任何情况下,我的个人理念是您在CI中所做的任何事情都应该能够在CLI中完成,例如,作为本地开发人员大楼(飞机上的经典脱机笔记本电脑场景),作为devops远程调试,等等。CI的工作是吸引眼球并触发生成/部署脚本,该脚本完成了它需要做的所有事情,并在VCS中与代码本身一起进行版本控制,因此依赖于只有TFS才能完成但本地MSBuild不能完成的任务不是我[个人]建议的。这将是最后一个操作。想象一下在TFs中单独添加300多个项目,这是个好主意。但必须探索TFSAPI。你有没有什么好的链接可以快速获得想法?谢谢1)2)3)
<MSBuild Projects="@(MyProj)" 
         Targets="ReBuid" 
         Properties="Configuration='$(Configuration)'"
         RebaseOutputs="true" 
         ContinueOnError="true"
/>