2017-12-27 320 views
0

我有一個由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,我決定繼續以覆蓋績效結果它的開放和自我回答。

+0

通過調用重建目標而不是使用Clean/Build調用MSbuild兩次來加速構建(一點點),最終結果是相同的。對於其他部分:應該是一個相當簡單的MSbuild主腳本,但是具有Package目標的項目必須以特定順序調用嗎?它們是相互依賴於Package對象還是隻依賴Build對象? – stijn

+0

@stijn(1)'重建':小細節,不完全是我正在解決的問題,以及我已經擺脫的問題。 (2)不,他們不相互依賴。 SharePoint WSP軟件包是最終產品 - 一行「exe」。但是,它們每個都依賴於解決方案中的多個類庫項目。 –

+0

@stijn換句話說,我需要幫助的是「相當簡單的MSbuild主腳本」,因爲這是一個我以前不需要太多介入的工具。 –

回答

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開關施加
  • CleanP是短期的CleanPackage
  • 「複製本地」是除了在最快true build

硬件:具有16 GB RAM的WS2016 VM,運行在雙至強E5-2695 v2 Hyper-V服務器上的24個vCPU。

相關問題