【问题标题】:MSBuild speedup: how to remove unnecessary project builds?MSBuild 加速:如何删除不必要的项目构建?
【发布时间】:2023-03-18 15:53:01
【问题描述】:

我有一个包含多个项目的解决方案。比方说

项目 A 依赖于项目 B 和 C

项目B依赖项目C

当我在本地机器上运行我的解决方案时,VS 会为每个项目构建一次,这需要 1 分钟。但是,在我们的构建机器上,构建大约需要 4 分钟,而且我可以从 MSBuild 日志中了解到,它是这样的:

构建 A -> 为 A 构建 B,为 A 构建 C

构建 B -> 为 B 构建 C

所以它会多次构建一些项目...如何加快构建过程?

附:这不是多出 3 分钟的问题,我只是想知道为什么它与我的本地机器构建如此不同?

【问题讨论】:

  • 您使用什么工具在您的构建机器上构建?可以手动控制构建顺序吗?
  • 我有一个 msbuild 的配置文件,它指定了 SolutionToBuild... 一些其他的东西,但没有特定的构建顺序。
  • 可能是你在服务器上重建并且只在你的机器上构建

标签: optimization tfs msbuild


【解决方案1】:

我不确定您的构建顺序。有时,TeamBuild 看起来像是在一遍又一遍地构建项目,但它是为不同的配置构建的。查看并确保您没有定义多个 FlavorsToBuild。

另外,如果您不想每次都重新检出并重新构建,您可以在 TFSBuild 文件的底部进行定义。

<PropertyGroup>
    <IncrementalBuild>true</IncrementalBuild>
</PropertyGroup>-->

把它放在&lt;/Project&gt;标签之前。

【讨论】:

  • 通过 MSDN 中的描述,我可以看到这正是我所需要的:增量构建。仍然只是将此标签添加到配置文件中并没有改变任何东西......我是否需要更进一步并弄乱输入/输出?或者我的环境中的路径可能有问题,所以 msbuild 看不到以前构建的文件?...msdn.microsoft.com/en-us/library/ms171483.aspx
【解决方案2】:

这个示例似乎对我有用。 TestLib.Extra 依赖于 TestLib。如果我在 TestLib 中更改某些内容,两个项目都会构建。如果我只在 TestLib.Extra 中进行更改,则只会构建那个,如果我根本不更改任何内容,他们只会报告 Skipping target "CoreCompile" 因为所有输出文件都是最新的 em> 等等。

<Target Name="Build">
  <MSBuild Targets="Build" Projects="TestLib\TestLib.csproj" />
  <MSBuild Targets="Build" Projects="TestLib.Extra\TestLib.Extra.csproj" />
</Target>

诀窍是使用项目的“构建”目标,而不是“重建”。它们之间的区别与Visual Studio中构建菜单中的“Build”和“Rebuild”命令的区别本质上是一样的。

编辑

如果项目包含在解决方案文件中,并且您指定要构建的解决方案,这也很有效:

<Target Name="Build">
  <MSBuild Targets="Build" Projects="TestLib.sln" />
</Target>

【讨论】:

  • 嗯...我正在使用“SolutionToBuild”命令。就像在 MSDN 中一样:msdn.microsoft.com/en-us/library/ms181718(VS.80).aspx
  • @Yacoder:SolutionToBuild 不是命令;它仅指定文件并将它们与名称“SolutionToBuild”相关联。此名称将在 msbuild 脚本的其他地方使用以执行实际构建。这就是您可以执行我在示例中显示的操作的地方。
【解决方案3】:

也许和我们的一样,您的构建服务器是一个虚拟机(至少慢 10 倍)。

TFS(可能还有其他)也会对构建进行全新的检查,因此无论如何它都必须构建所有项目。

【讨论】:

  • 我们确实构建了虚拟机 - HyperV - 与普通机器相比几乎没有什么区别......一旦我们将项目移动到(虚拟)SCSI磁盘即。 HyperV IDE 磁盘太慢了。
【解决方案4】:

您是否在使用 /maxcpucount 开关?本地机器和构建机器之间的处理器数量可能存在差异。此设置在您的 msbuild 文件和 Visual Studio 设置之间也可能不同,这也可以解释您在构建时间上看到的差异。

【讨论】:

    【解决方案5】:

    我这样做如下。这是一个有点复杂的自定义构建系统,但基本思想是。

    1. 在许多解决方案中重复使用的 dll 构建到已知文件夹。这是我使用构建这些常见 dll 的 msbuild 项目文件实现的。
    2. 在解决方案中构建其​​他 csproj 文件时,我们复制 csproj 文件,然后使用 xslt 操作将项目引用替换为这些常见 dll 的 dll 引用。
    3. 构建脚本然后使用我们维护的与每个解决方案相对应的自定义 msbuild 项目文件来构建这些更改的 csproj 文件。我们不构建 .sln 文件。这些自定义项目文件是 .csproj 文件的项目组,它们以正确的依赖顺序排列。

    也许这可以帮助你实现你想要的。

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 2012-04-04
      • 2021-05-25
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多