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

时间:2017-12-27 11:21:10

标签: sharepoint msbuild

我有一个包含50多个类库和~10个SharePoint WSP项目的大型解决方案。我正在尝试优化构建时间,因为默认情况下它在一个不错的服务器硬件上需要5分钟以上。

目前,构建过程的工作原理如下(伪代码):

var str1 = "hello hello [#[#hello]#] [#[#hi]#] [#[#welcome]#]";
var reg = /\[[#[a-zA-Z0-9]+]#]/ig;
var arr = str1.match(reg);
console.log(arr)

我想要实现的是使用单个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 } 调用完成所有这些操作,以便在打包WSP项目时可以并行化构建过程并避免重复处理。

我可以轻松地为单个WSP项目做到这一点:

MSBuild.exe

然而,当我为整个解决方案做同样的事情时:

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

MSBuild失败并在解决方案文件中找到不包含MSBuild.exe MySolution.sln /T:Clean;CleanPackage;Build;Package 目标的项目后立即报告错误:

  

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

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

注意:虽然我的问题类似于this one,但我决定将其保持开放并自行回答,以便涵盖绩效结果。

1 个答案:

答案 0 :(得分:0)

正如评论中所指出的,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开关
  • CleanPCleanPackage
  • 的缩写
  • “复制本地”为true,速度最快的构建
  • 除外

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