构建包含仅存在于解决方案中的项目子集中的目标的解决方案

我有一个由50个以上的类库和〜10个SharePoint WSP项目组成的大型解决方案。我试图优化构建时间,因为默认情况下,它需要5分钟以上体面的服务器硬件。构建包含仅存在于解决方案中的项目子集中的目标的解决方案

目前,生成过程是这样的(伪):

MSBuild.exe MySolution.sln /T:Clean 

MSBuild.exe MySolution.sln /T:Build

foreach (Project.csproj in *.csproj where is WSP project)

{

MSBuild.exe Project.csproj /T:CleanPackage

MSBuild.exe Project.csproj /T:Package

}

我想实现的就是做这一切使用单一MSBuild.exe调用,从而使构建过程可以被并行化和重复处理在包装WSP项目时被避免。

我可以为一个WSP项目做到这一点很容易:

MSBuild.exe Project.csproj /T:Clean;CleanPackage;Build;Package 

然而,当我做整体解决方案相同:

MSBuild.exe MySolution.sln /T:Clean;CleanPackage;Build;Package 

MSBuild的失败并报告错误,只要它在解决方案文件中找到不包含CleanPackage目标的项目:

D:\ MySolution \ Clas s.Library.Project \ Class.Library.Project.csproj:错误MSB4057:目标“CleanPackage”在项目中不存在。

所以,问题是,如何解决这个问题,实现了单命令行生成调用无)进行手动更改所有csproj文件(维护梦魇),B)编写自定义复杂的构建脚本?我正在考虑定义一个包含一个自定义Target的主构建文件。但是,我不确定如何在解决方案文件中向项目表达正确的依赖关系,而无需手动枚举两个组(类库,WSP项目)中的所有单个项目。


注:虽然我的问题是类似this one,我决定继续以覆盖绩效结果它的开放和自我回答。

回答:

正如评论中指出的,this answer提供了一个很好的方法来实现我所需要的。但是,我的问题范围更广泛一些,主要关注构建性能。因此,这个答案也包括其他发现和结果。

我补充构建脚本是这样的:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

<!-- Enforce "Copy Local = false" on all references -->

<ItemDefinitionGroup>

<Reference>

<Private>False</Private>

</Reference>

</ItemDefinitionGroup>

<!-- substitute empty CleanPackage and Package targets to each project in case there is no actual implementation -->

<Target Name="CleanPackage" />

<Target Name="Package" />

</Project>

我还包括一个覆盖执行“复制本地”来false,从而避免引用的SharePoint组件的那个复制。这个单独的设置消除了在构建过程中将3.2 GB(!)的DLL和相关文件复制到输出文件夹。我认为这仍然是实验性的,需要进行一些微调,因为我预计某些调试和单元测试场景可能会停止工作。

最后,单命令行调用MSBuild的作品。需要额外的参数才能将参考传递给补充构建脚本。

MSBuild.exe MySolution.sln /T:Clean;CleanPackage;Build;Package /p:CustomBeforeMicrosoftCommonTargets=D:\MySolution\package.targets 

我能够从301秒减少构建时间下降到平均40.5秒,一个86.5%的改善。我使用的生成序列是:

Build sequence without packaging   Avg [sec] Improvement 

---------------------------------------- ---------- --------------

sequential 1xClean, 1xBuild (no package) 124.3

parallel 1xClean, 1xBuild 58.0 -74.1 (-59.6%)

Build sequence with packaging Avg [sec] Improvement

---------------------------------------- ---------- --------------

sequential 1xClean, 1xBuild, NxPackage 301.0

parallel 1xClean+Build, 1xCleanP+Package 111.0 -190.0 (-63.1%)

parallel 1xClean+Build+CleanP+Package 83.0 -218.0 (-72.4%)

parallel optimized (Copy Local=false) 40.5 -260.5 (-86.5%)

注:

  • parallel意味着/m开关施加
  • CleanP是短期的CleanPackage
  • “复制本地”是除了在最快true build

硬件:具有16 GB RAM的WS2016 VM,运行在双至强E5-2695 v2 Hyper-V服务器上的24个vCPU。

以上是 构建包含仅存在于解决方案中的项目子集中的目标的解决方案 的全部内容, 来源链接: utcz.com/qa/264567.html

回到顶部