将Visual Studio构建日志按“构建顺序”样式排序

3
在Visual Studio 2008的“输出”窗口中有一个“显示来自”下拉列表,允许按线程(构建顺序)查看构建事件。当在多核机器上构建大型解决方案时,这非常有用,因为来自这些线程的日志条目是不同步的。
我们的组织拥有自动化构建流程,其中使用类似以下内容的批处理模式编译解决方案:
devenv Solution.sln /USEENV /build Release /out buildlog.txt

这将会加载Solution.sln,并以Release配置进行构建,并将构建日志输出到buildlog.txt
问题在于:buildlog.txt是类似于“构建”输出的输出,而不是“构建顺序”,因此它很难阅读。是否有命令行过滤器或其他东西,可以将输出转换为“构建顺序”格式?
3个回答

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]);
    }
}

1

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

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

请参阅msbuild文档获取有关日志记录选项的信息。你可能会发现这将使你具备更合理的输出能力。


我猜这个方法是有效的解决方案,尽管当我使用以下命令行运行它时,我无法使msconfig构建解决方案:"MSBuild.exe Solution.sln /p:Configuration=Debug /p:PlatformName=Win32",但一旦修复了这个问题,我想我可以编写自定义记录器来正确记录日志。我仍然希望看到是否有更简单的解决方案。 - galets
尝试运行以下命令: msbuild Solution.sln /p:Configuration="Release|Win32" /target:"MainProject" - the_mandrill
我运行了msbuild,它一次只构建一个项目。我认为Visual Studio会生成多个MSBuilds。 - galets
我认为这可能是正确的 - 或许在VS2010中,msbuild能够并行化。 - the_mandrill
msbuild有/m命令行开关,可启用并发构建进程。 - Kevin Smyth
显示剩余2条评论

0

我认为Walter的答案并不适用于所有情况,因为我曾经在构建C#项目时遇到过问题,而VS打印的编译结果没有任何进程ID!例如:

1>------ 开始生成: 项目: MyProj, 配置: Debug Any CPU ------

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

请注意,我删除了大部分其他输出,但是想象一下您正在构建许多项目,并且“编译完成”行没有插入到正确的项目之后,您将如何找到哪个项目“编译完成”属于?


可能不完全准确,但至少它提供了可读的输出。由于msbuild是单线程的,使用它实际上就是设置Visual Studio一次只使用1个进程,对此我无需特别操作,可以通过选项完成。 - galets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接