2011-04-14 56 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