msbuild - Biztalk 2009 和 2010 .btproj 项目中的增量构建支持吗?

标签 msbuild biztalk biztalk-2009

在追求增量构建时间改进时,我发现 .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 文件的补丁,或者是否有另一个不支持增量构建的充分理由?

最佳答案

您可以通过一些非常简单的更改来启用 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 文件中定义的原始目标非常相似。事实上,我做了两个简单的更改:

  1. 第一个更改涉及修改 SecondPass 目标并在 Condition 属性中添加额外的测试。如果您的项目甚至没有业务流程,此测试对于防止发生第二次传递很有用。

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

这就是全部内容。

关于msbuild - Biztalk 2009 和 2010 .btproj 项目中的增量构建支持吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5660541/

相关文章:

f# - 如何插入代码质量指标 - FAKE F#MAKE

web-services - BizTalk 与 WCF 服务 - 服务中的空对象

c# - Linux 构建代理上的 SonarQube MsBuild 扫描器

c# - 在 MSBuild 的解决方案中循环项目

azure - BizTalk 未从 Azure 服务总线获取消息

web-services - 使用BizTalk Web服务重新发布内部Web服务

biztalk - 确定使用发送端口宏时发送的实际文件名

biztalk - 仅将第一次出现映射到目标节点

biztalk - 在BizTalk中,为什么要同时导入和安装MSI文件?