我将立即承认对 msbuild 完全不熟悉,并希望我不是在问一个愚蠢的问题。
我们有一个大型 .NET 解决方案,其中包含大约 316 个项目。在构建过程中,将 DLL 从一个文件夹复制到下一个文件夹似乎占用了大量的构建时间(我假设,这样它们就可以用于解析引用?)。有没有办法指示 MSBuild 将每个项目的输出文件放入一个文件夹以避免需要这样做?看起来这将是一件明智的事情,因为最终我们将最终结果从最终输出文件夹中复制出来,而所有其他中间 DLL 都被浪费了。
可以通过覆盖OutDir
属性来实现。例如:
msbuild your.sln /p:Configuration=Release;OutDir="C:\SomeFolder\Release" /m
此外,您可以禁用 CopyLocal 设置以加快构建过程的引用。
请参阅obj 和 bin 文件夹(由 Visual Studio 创建)的用途是什么?
确保它实际上是需要时间的副本。使用/verbosity:diag运行 msbuild 命令(或使用/flp:Filename=<myfile>;Verbosity=diag写入文件)。在文件末尾,您将看到每个步骤所用的时间。
您可以尝试使用/m选项并行化构建。默认情况下,msbuild 在 1 个线程上运行,并且有 316 个项目,我可以想象这可能会很慢。
构建 316 个项目是一次构建很多项目。您可以考虑将您的项目分解为分离依赖项的逻辑解决方案。
还可以通过将 max CPU count 属性设置为更高的值来并行构建项目来加快速度。
BuildInParallel 是 MSBuild 任务的可选布尔参数。当 BuildInParallel 设置为 true(其默认值)时,会生成多个工作进程以同时构建尽可能多的项目。要使其正常工作,/maxcpucount 开关必须设置为大于 1 的值,并且系统必须至少是双核或具有两个或更多处理器。
下面是一个示例,取自 microsoft.common.targets,关于如何设置 BuildInParallel 参数。/maxcpucount:number 指定构建中涉及的工作进程数。例如:C:\Windows\WinFX\v3.5>msbuild.exe *.proj /maxcpucount:3。此示例指示 MSBuild 使用三个 MSBuild.exe 进程进行构建,从而允许并行构建三个项目。/m 也是可以接受的。