以“构建顺序”样式对Visual Studio构建日志进行排序

时间:2009-10-16 18:39:55

标签: visual-studio visual-studio-2008 build-process build build-automation

Visual Studio 2008“输出”窗口中有一个“显示输出来自”下拉列表,该窗口允许查看按线程(Build Order)排序的构建事件。这在多核计算机上构建大型解决方案时非常有用,因为这些解决方案的日志条目不同步。

我们的组织拥有自动构建流程,其中解决方案以批处理模式编译,使用类似于:

devenv Solution.sln /USEENV /build Release /out buildlog.txt

这将加载Solution.sln,将其添加到Release配置中,并将构建日志输出到buildlog.txt

问题是:buildlog.txt是类似“Build”输出的输出,而不是“Build Order”,因此很难阅读。是否有命令行过滤器或其他东西,它会将输出转换为“构建顺序”格式?

4 个答案:

答案 0 :(得分:1)

我不知道这是否会解决格式问题,但您可以尝试使用msbuild代替devenv,使用命令行,例如:

msbuild Solution.sln /p:Configuration=Release /logger:XMLLogger,C:\Loggers\MyLogger.dll;OutputAsHTML

有关日志记录选项的信息,请参阅msbuild的文档。您可能会发现这将使您能够获得更合理的输出。

答案 1 :(得分:1)

使用简单的过滤器,类似:

static void Main(string[] args)
{
    var lines = new Dictionary<int, StringBuilder>();
    var line = Console.In.ReadLine();
    while (line != null)
    {
        int process = 0;
        var re = new Regex(@"^(?<process>\d+)\>.*$");
        if (re.IsMatch(line))
        {
            var match = re.Match(line);
            process = Convert.ToInt32(match.Groups["process"].Value);
        }

        if (!lines.ContainsKey(process))
        {
            lines[process] = new StringBuilder();
        }
        lines[process].AppendLine(line);

        line = Console.In.ReadLine();
    }

    foreach (var i in lines.Keys)
    {
        Console.Write(lines[i]);
    }
}

答案 2 :(得分:0)

我认为Walter的答案并不适用于所有情况,因为我在构建C#项目时已经看到了这个问题,VS在没有任何进程ID的情况下打印了Compile结果!比如

1&gt; ------ Build build:Project:MyProj,Configuration:Debug Any CPU ------

编译完成 - 1个错误,0个警告

请注意我删除了大部分其他输出但是想象你正在构建很多项目并且在正确的项目之后没有插入编译完整行,你将如何找到Compile complete所属的项目?

答案 3 :(得分:0)

SortBuildOutput实用程序可以对构建日志进行排序。 它基于Waltersnippet