Msbuild Biztalk 2009和2010.btproj项目中的增量生成支持?

Msbuild Biztalk 2009和2010.btproj项目中的增量生成支持?,msbuild,biztalk,biztalk-2009,Msbuild,Biztalk,Biztalk 2009,在追求增量构建时的改进时,我发现.btproj文件以及依赖于这些文件的所有其他项目都在每个增量构建上重建(部分)。一直跟踪到BizTalkCommon.targets,我发现它对程序集进行了2次编译,但只有第一次编译涉及到已经构建的工件,从而打破了依赖链的增量部分。在BizTalkCommon.targets(第228行)中可以看到违规目标: 我意识到2遍构建是有原因的,但我无法相信,不可能为目标指定适当的输入和输出来正确处理增量构建 有人知道是否有针对.targets文件的修补程序,或者是

在追求增量构建时的改进时,我发现.btproj文件以及依赖于这些文件的所有其他项目都在每个增量构建上重建(部分)。一直跟踪到BizTalkCommon.targets,我发现它对程序集进行了2次编译,但只有第一次编译涉及到已经构建的工件,从而打破了依赖链的增量部分。在BizTalkCommon.targets(第228行)中可以看到违规目标:


我意识到2遍构建是有原因的,但我无法相信,不可能为目标指定适当的输入和输出来正确处理增量构建


有人知道是否有针对.targets文件的修补程序,或者是否有不支持增量生成的另一个很好的原因?

这是我的团队不久前遇到的问题,他们只是放弃自定义生成文件,转而使用BizTalk部署框架。BizTalk在VS级别上做了很多“有趣”的事情,因为2009年是BizTalk没有使用外部构建过程的第一个版本。但是我不确定为什么需要第二次编译,除非是从设计师的角度来看。

您可以通过几个非常简单的更改来启用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>
它是如何工作的

BizTalk Server项目需要分两次编译。第一个过程编译模式、映射和管道,而第二个过程编译业务流程

您会注意到,覆盖的目标与原始目标非常相似,它们是在
BizTalkCommon.targets文件中定义的。事实上,我做了两个简单的改变:

  • 第一个更改涉及修改
    SecondPass
    目标,并在
    条件
    属性中添加额外的测试。如果您的项目甚至没有业务流程,此测试可用于防止第二次通过

  • 不幸的是,如果您的项目包含业务流程,则原始的
    SecondPass
    目标将删除中间程序集,然后继续编译业务流程。但是,如果所有文件都是最新的,则不需要运行
    CompileODX
    目标。因此,第二个更改涉及将
    Delete
    任务从
    SecondPass
    目标移动到
    compiledDX
    目标


  • 这就是问题所在。

    BizTalk部署框架看起来很有希望,但就我所见,它仍然不能真正帮助增量构建的构建时间?它并没有专门解决您的问题,但有一些钩子您可以扩展以使您更接近。BizTalk构建有点像一个黑匣子,太多的混乱肯定会导致问题。请与BizTalk Server 2010配合使用。不过,我没有机会在BizTalk Server 2010 R2上试用。试用后,效果确实不错。构建时间显著缩短。谢谢
    <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>
    
      <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
      <Import Project="$(MyCustomExtensions)\BizTalkCustom.targets" />