2011-04-14 60 views
5

在追逐增量構建時間改進時,我發現.btproj文件以及依賴於這些文件的所有其他項目都會在每個增量構建中重建(部分)。跟蹤這一路BizTalkCommon.targets,我發現它執行程序集的2遍編譯 - 但只有第一遍方面已經構建了工件,從而打破了依賴鏈的增量部分。該問題的目標可以在BizTalkCommon.targets(線228)可以看出:Biztalk 2009和2010 .btproj項目中的增量構建支持?

<!-- Delete the assembly and rerun the build process --> 
<Target Name="SecondPass" 
     Condition="$(SecondBuild)!=true and $(TempAssemblyOnly)!=true"> 

    <Delete Files="@(IntermediateAssembly)" /> 
    <MSBuild Projects="$(MSBuildProjectFile)" Properties="SecondBuild=true"/> 
</Target> 

我意識到,還有一個供2通構建一個原因,但根本無法相信這是不可能的,指定適當的輸入和輸出目標以正確處理增量構建。

有沒有人知道是否有.targets文件的補丁,或者如果增量構建不被支持有另一個好的理由?

回答

3

您可以通過一些非常簡單的更改啓用MSBuild BizTalk項目的增量編譯。基本上,您需要覆蓋BizTalkCommon.targets文件中定義的兩個目標。

這些目標可以在您自己的.btproj文件中重寫,並且不需要修改BizTalk附帶的原始.targets文件。

如何

首先創建你自己的.targets文件託管您的自定義,比如BizTalkCustom.targets

<Import Project="$(MSBuildExtensionsPath)\Microsoft\BizTalk\BizTalkC.targets" /> 

<!-- Rerun the build process (second pass) --> 
<Target Name="SecondPass" Condition="$(SecondBuild)!=true and $(TempAssemblyOnly)!=true and @(XLang)!=''"> 
    <MSBuild Projects="$(MSBuildProjectFile)" Properties="SecondBuild=true" /> 
</Target> 

<!-- Compile XLang/s orchestration --> 
<Target 
    Name="CompileODX" 
    Condition="$(SecondBuild)==true" 
    Inputs="@(XLang);$(MSBuildAllProjects);$(ClrTypesAssembly)" 
    Outputs="$(BuildDone)"> 

    <!-- Delete previously generated C# files from XLang compilation --> 
    <Delete Files="@(IntermediateAssembly)" /> 
    <Delete Files="@(CSharpOutputFromXLang)" /> 

    <XLangTask XLangItems="@(XLang)" 
      ProjectReferences="@(ReferencePath)" 
      WarningLevel="$(WarningLevel)" 
      BpelCompliance="$(BpelCompliance)" 
      DefineConstants="$(DefineConstants)" 
      TreatWarningsAsErrors="$(TreatWarningsAsErrors)" 
      TempAssembly="$(ClrTypesAssembly)" 
      OutputDirectory="$(XLangOutputPath)"> 
    </XLangTask> 
</Target> 

然後,在你的.btproj文件替換最後一個Import聲明:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
    <Import Project="$(MyCustomExtensions)\BizTalkCustom.targets" /> 

它是如何工作的

BizTalk Server項目需要以某種方式在兩遍中編譯。第一遍編譯模式,地圖和管道,而第二遍編譯編排。

您會注意到,被覆蓋的目標非常類似於BizTalkCommon.targets file中定義的原始目標。事實上,我做了兩個簡單的改動:

  1. 第一個變化涉及修改SecondPass目標,並在Condition屬性增加一個額外的測試。如果你的項目甚至沒有Orchestrations,這個測試是有用的,以防止發生第二遍。

  2. 不幸的是,如果您的項目包含業務流程,原始的SecondPass目標刪除中間程序集,然後繼續編譯業務流程。但是,如果所有文件都已更新,CompileODX目標不需要運行。因此,第二次更改涉及將Delete任務從SecondPass目標移動到CompiledODX目標。

這就是它的全部。

+0

你用BizTalk 2010試過這個嗎? – 2012-09-20 18:50:25

+0

適用於BizTalk Server 2010.儘管如此,沒有機會嘗試使用BizTalk Server 2010 R2。 – 2012-09-20 20:47:05

+0

試過了,確實有效。生產時間顯着下降。謝謝! – 2012-09-20 21:01:07

1

這是我的團隊在一段時間後遇到的問題,並簡單地退出了自定義構建文件並轉而使用BizTalk部署框架,位於here。 BizTalk從VS級別做了很多「有趣」的事情,因爲2009年是BizTalk第一個版本沒有使用外部構建過程。但我不確定爲什麼需要第二遍,除了從設計師的角度來看。

+0

BizTalk部署框架看起來很有前途,但它仍然不能真正幫助增量構建的構建時間,據我所知? – RasmusKL 2011-04-26 21:01:17

+1

它沒有具體解決你的問題,但有一些鉤子,你可以延長,讓你更接近一點。 BizTalk構建是一種黑盒子,太多的混亂會導致問題。 – 2011-04-28 22:37:22