【问题标题】:Sort Visual Studio build log in "Build Order" style以“构建顺序”样式对 Visual Studio 构建日志进行排序
【发布时间】:2010-12-07 11:20:32
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案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】:

      我不知道这是否会解决格式问题,但您可以尝试使用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 ",但一旦修复,我想,我可以编写自定义记录器来正确记录。我还是想看看有没有更简单的解决方法
      • 试试:msbuild Solution.sln /p:Configuration="Release|Win32" /target:"MainProject"
      • 没用,但MSBuild.exe Solution.sln /p:Configuration=Debug /p:Platform=Win32 没用。如果我错了,请纠正我,但 MSBuild 不是一次只构建一个项目吗?如果是,这将如何帮助我进行并行构建?
      • 我认为 msbuild 可以并行构建。如果我没记错的话,Visual Studio 本身在后台使用 msbuild。
      • 我运行了 msbuild,它一次只构建一个项目。我认为 Visual Studio 产生了多个 MSBuilds
      【解决方案3】:

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

      1>----- 构建开始:项目:MyProj,配置:调试任何 CPU ------

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

      请注意,我删除了大部分其他输出,但假设您正在构建很多项目,并且没有在正确的项目之后插入 Compile complete 行,您将如何找到 Compile complete 属于哪个项目?

      【讨论】:

      • 可能不会,但至少它提供了可读的输出。由于 msbuild 是单线程的,所以使用它实际上只是将 Visual Studio 设置为一次使用 1 个进程,为此我不需要做任何特别的事情,可以通过选项来完成
      猜你喜欢
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多