5

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

<!-- 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 文件是否有补丁,或者是否有另一个很好的理由不支持增量构建?

4

2 回答 2

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>

然后,替换Import.btproj 文件中的最后一条语句:

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

它是如何工作的

BizTalk Server 项目需要以某种方式分两次编译。第一遍编译模式、映射和管道,而第二遍编译编排。

您会注意到覆盖的目标与原始目标非常相似,在BizTalkCommon.targets file. 事实上,我做了两个简单的改变:

  1. 第一个更改涉及修改Target 并在属性SecondPass中添加额外的测试。Condition如果您的项目甚至没有编排,此测试对于防止发生第二遍非常有用。

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

这里的所有都是它的。

于 2011-10-26T10:41:50.397 回答
1

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

于 2011-04-23T12:45:31.237 回答