如何使用 BatchBuild 并行构建多个 C++ Visual Studio v2015+ 配置
Posted
技术标签:
【中文标题】如何使用 BatchBuild 并行构建多个 C++ Visual Studio v2015+ 配置【英文标题】:How can you build multiple C++ visual studio v2015+ configurations in parallel using BatchBuild 【发布时间】:2020-05-11 09:58:06 【问题描述】:我对 IDE 非常熟悉(23 年),但对 MSBuild 完全不熟悉。
我已经阅读并重新阅读了 https://docs.microsoft.com/en-gb/visualstudio/msbuild/building-multiple-projects-in-parallel-with-msbuild?view=vs-2015 关于让 MSBuild 并行构建多个配置的内容,但我不明白如何将其连接到“批量构建”(或者实际上是 MSBuild,这将是我的最佳选择)。
为了以不同的方式描述我想要实现的目标,如果我将项目的 30 个副本全部指向相同的代码,每个副本都有一个配置,那么我可以批量构建,它们将充分利用多个内核,一个配置 30 个项目,它们都是串行构建的,对 CPU 内核的使用非常差。
顺便说一句,我不明白为什么 IDE 可以选择并行构建多个项目和多个文件,但没有多个配置。
【问题讨论】:
非常感谢您的帮助,但我如何使用 A 做 B 的答案不是废弃 A 而使用 C。 C 可能是一个很好的工具,但它不是答案。最接近肯定答案的方法是对该功能进行投票并希望它进入 VS 更新。 【参考方案1】:顺便说一句,我不明白为什么 IDE 有以下选项 并行构建多个项目和多个文件,但不是 多种配置。
其实,在 VS IDE 中,Batch Build UI 有一个选项来配置项目的配置。
但它可以为项目配置多个configuration
、Platform
.....但不会并行处理构建项目。
建议
我建议您可以使用 msbuild 脚本,然后使用 MSBuild 命令行 来运行多个平台的多个项目。
1)创建一个名为test.proj
的文件
2)在其中添加这些:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ProjectFile Include="C:\xxxx\ConsoleApplication1.vcxproj">
<Properties>Configuration=Release</Properties>
</ProjectFile>
<ProjectFile Include="C:\xxx\ConsoleApplication1.vcxproj">
<Properties>Configuration=Debug</Properties>
</ProjectFile>
<ProjectFile Include="C:\xxx\ConsoleApplication1.vcxproj">
<Properties>Configuration=xxx</Properties>
</ProjectFile>
.....
// add any configuration like this and remember to include the related vcxproj and even the same vcxproj has to be written for different configurations.
</ItemGroup>
<Target Name="ParelBuild">
<MSBuild Projects="@(ProjectFile)" BuildInParallel="true" Targets="Build" />
</Target>
</Project>
见this similar issue。
3) 注意:Developer Command Prompt for VS2015
没有显示并行构建的功能,我感到很困惑。
所以要并行构建,我建议你可以下载Build Tool for VS2019,它可以与VS2019分开安装,并且支持低版本的MSBuild 14.0。而且我已经测试成功了。
(下载链接位于All Downloads-->Tools for Visual Studio 2019)
4) 使用此 MSBuild 命令行进行构建:
msbuild test.proj -t:ParelBuild -v:normal -m:30
效果如下:
更新 1
在不同的时间建立你自己的项目组合,你可以试试这些:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ProjectFile Include="C:\xxxx\ConsoleApplication1.vcxproj">
<Properties>Configuration=Release</Properties>
</ProjectFile>
<ProjectFile Include="C:\xxx\ConsoleApplication1.vcxproj">
<Properties>Configuration=Debug</Properties>
</ProjectFile>
<ProjectFile Include="C:\xxx\ConsoleApplication1.vcxproj">
<Properties>Configuration=xxx</Properties>
</ProjectFile>
.....
// add any configuration like this and remember to include the related vcxproj and even the same vcxproj has to be written for different configurations.
</ItemGroup>
<ItemGroup>
<ProjectFile1 Include="C:\xxxx\ConsoleApplication1.vcxproj">
<Properties>Configuration=Release</Properties>
</ProjectFile1>
<ProjectFile1 Include="C:\xxx\xxx.sln">
<Properties>Configuration=Debug</Properties>
</ProjectFile1>
........
</ItemGroup>
<Target Name="ParelBuild1">
<MSBuild Projects="@(ProjectFile1)" BuildInParallel="true" Targets="Build" />
</Target>
</Project>
那么先一次构建 ParelBuild 目标:
msbuild test.proj -t:ParelBuild
在它之后,在另一个时间,执行这个:
msbuild test.proj -t:ParelBuild1
这允许您在不同时间点并行执行组合项目。
【讨论】:
感谢您提供免费信息,但它不能回答问题。我需要在不同的时间构建不同的配置组合,所以看起来我需要一个 MSBuild 项目来处理每个可能的项目组合。第二个问题是您的答案不包括解决方案,因此将缺少解决方案信息。需要 BatchBuild 集成的这两个原因。看起来我可能能够指定解决方案,但我似乎记得无法指定解决方案、项目和配置但没有尝试过。 其实也可以像xxx.vcxproj
文件一样定义xxx.sln
文件:<ProjectFile1 Include="C:\xxx\xxx.sln"> <Properties>Configuration=Debug;Platform=xxx</Properties> </ProjectFile1>
。要清理该组合项目,您也可以<MSBuild Projects="@(ProjectFile1)" BuildInParallel="true" Targets="Clean" /> </Target>
.
你可以试试我的解决方案并测试一下。如果实现您的要求,您可以考虑接受它,因为它有一个解决方法。【参考方案2】:
答案是你不能做我想做的事,但 Parry Qian-MSFT 有一个解决方法。 https://developercommunity.visualstudio.com/ 上有一个开放的请求,所以我赞成它,希望它可以轻松地集成到 Visual Studio 的未来版本中。我确定它可能是一个插件,但我目前没有时间调查。
【讨论】:
既然你对这个问题有自己的解决方案,我建议你可以标记你的答案。 该解决方法很有帮助,但不能回答问题,也不能替代 GUI 中与出色的内置 BatchBuild 功能配合使用的内置并行选项。以上是关于如何使用 BatchBuild 并行构建多个 C++ Visual Studio v2015+ 配置的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Travis CI 中为 C++ 项目并行运行多个构建,每个构建都有单独的脚本?