Visual studio 对Visual Studio生成日志进行排序“登录”;“建立秩序”;风格

Visual studio 对Visual Studio生成日志进行排序“登录”;“建立秩序”;风格,visual-studio,visual-studio-2008,build-process,build,build-automation,Visual Studio,Visual Studio 2008,Build Process,Build,Build Automation,VisualStudio2008“输出”窗口中有一个“ShowOutput from”下拉列表,允许查看按线程()排序的生成事件。这在多核机器上构建大型解决方案时非常有用,因为来自这些机器的日志条目是不同步的 我们的组织有自动构建过程,其中解决方案以批处理模式编译,使用如下方式: devenv Solution.sln /USEENV /build Release /out buildlog.txt 这将加载Solution.sln,在Release配置中构建它,并将构建日志输出到buildl

VisualStudio2008“输出”窗口中有一个“ShowOutput from”下拉列表,允许查看按线程()排序的生成事件。这在多核机器上构建大型解决方案时非常有用,因为来自这些机器的日志条目是不同步的

我们的组织有自动构建过程,其中解决方案以批处理模式编译,使用如下方式:

devenv Solution.sln /USEENV /build Release /out buildlog.txt
这将加载
Solution.sln
,在
Release
配置中构建它,并将构建日志输出到
buildlog.txt


问题是:
buildlog.txt
是一个类似于“构建”输出的输出,而不是“构建顺序”,因此,它很难读取。是否有命令行筛选器或其他东西,可以将输出转换为“生成顺序”格式?

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

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


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

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

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]);
    }
}
static void Main(字符串[]args)
{
var lines=newdictionary();
var line=Console.In.ReadLine();
while(行!=null)
{
int进程=0;
var re=new Regex(@“^(?\d+)\>*$”;
if(关于IsMatch(线路))
{
var匹配=重新匹配(行);
process=Convert.ToInt32(匹配.Groups[“process”].Value);
}
如果(!lines.ContainsKey(进程))
{
lines[process]=新的StringBuilder();
}
行[进程]。追加行(行);
line=Console.In.ReadLine();
}
foreach(行中的变量i.Keys)
{
控制台。写入(行[i]);
}
}

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

1> ----构建已启动:项目:MyProj,配置:调试任何CPU------

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


请注意,我删除了大多数其他输出,但假设您正在构建许多项目,并且未在正确的项目之后插入“编译完成”行,您将如何找到“编译完成”属于哪个项目?

我猜此方法是一种有效的解决方案,虽然在使用以下行运行解决方案时,我无法使msconfig生成解决方案:“MSBuild.exe solution.sln/p:Configuration=Debug/p:PlatformName=Win32”,但一旦解决了这个问题,我想,我可以编写自定义记录器来正确记录。我仍然想看看是否有更简单的解决方案:
msbuild Solution.sln/p:Configuration=“Release | Win32”/target:“MainProject”
不起作用,但
msbuild.exe Solution.sln/p:Configuration=Debug/p:Platform=Win32
起作用。如果我错了,请纠正我,但是MSBuild一次不只生成一个项目吗?如果是,这将如何帮助我并行构建?我认为msbuild可以并行构建。如果我没记错的话,VisualStudio本身在后台使用msbuild。我运行msbuild时,它一次只生成一个项目。我认为VisualStudio可能不会生成多个MSBuild,但至少它提供了可读的输出。由于msbuild是单线程的,使用它实际上只不过是将VisualStudio设置为一次使用一个进程,因此我不需要做任何特殊的事情,可以通过选项来完成