2009-06-08 65 views
1

我有一個解決方案,其中有幾個項目。比方說,MSBuild加速:如何刪除不必要的項目構建?

項目A依賴於項目B和C

項目B依賴於項目ç

當我運行我的本地機器VS建立每個項目一次就解決方案,它需要1分鐘。然而,我們的構建機器上大約需要4分鐘建立和,因爲我可以從它是這樣的MSBuild的日誌明白:

建立 - >打造B中A,打造下一個

構建B - >爲B構建C

因此,它多次構建一些項目......我如何加快構建過程?

P.S.這不是另外3分鐘的問題,我只是想知道爲什麼它與我的本地機器構建有很大的不同?

+0

您使用什麼工具構建您的構建機器?你可以手動控制構建順序嗎? – dss539 2009-06-08 16:27:19

+0

我有一個msbuild的配置文件,它指定了SolutionToBuild ...其他一些東西,但沒有特定的構建順序。 – 2009-06-08 17:24:02

+0

可能是你正在重建服務器上,並只建立在我們的機器上 – Uday 2009-07-15 12:33:59

回答

3

我不確定您的構建順序。有時TeamBuild可能看起來像是在反覆地構建項目,但它正在爲不同的配置而構建。看一看,並確保你沒有定義多個FlavorsToBuild。另外,如果你不想每次都重新檢查並重建,你可以在你的TFSBuild文件的底部定義這個。

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

把這個放在</Project>的標籤前面。

0

也許和我們的一樣,你的構建服務器是一個虛擬機(至少10倍速)。

另外TFS(也可能是其他人)在構建過程中進行全新結算,因此無論如何都需要構建所有項目。

+0

我們在虛擬機 - HyperV中建立 - 和正常機器相比幾乎沒有什麼區別...一旦我們將項目移動到(虛擬)SCSI磁盤是。 HyperV IDE磁盤很流行。 – bh213 2009-07-12 19:37:01

0

您使用/ maxcpucount開關嗎?本地機器和生成機器之間的處理器數量可能有所不同。這個設置也可以在你的msbuild文件和visual studio設置之間有所不同,這也可以解釋你在構建時所看到的差異。

1

此示例似乎適用於我。 TestLib.Extra依賴於TestLib。如果我在TestLib中更改了某些內容,那麼這兩個項目都將生成。如果我僅在TestLib.Extra中進行更改,那麼只會生成一個,如果我根本沒有更改任何內容,他們只會報告跳過目標「CoreCompile」,因爲所有輸出文件都是最新的等等。

<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> 
0

我這樣做如下。這是有點複雜的定製系統,但基本的想法是。

  1. 在許多解決方案中重用的dll被構建到已知文件夾。這是通過使用構建這些常用dll的msbuild項目文件實現的。
  2. 在解決方案中構建其​​他csproj文件時,我們複製csproj文件,然後使用xslt操作將這些常見dll的項目引用替換爲dll引用。
  3. 構建腳本然後使用我們維護的每個解決方案對應的自定義msbuild項目文件構建這些更改後的csproj文件。我們不建立.sln文件。這些自定義項目文件是按照正確的依賴順序的.csproj文件的項目組。

也許這可以幫助你實現你想要的。