在追求增量构建时间改进时,我发现 .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
file.
这些目标可以在您自己的 .btproj 文件中覆盖,并且不需要修改 BizTalk 附带的原始 .targets 文件。
How To
例如,首先创建您自己的 .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
。事实上,我做了两个简单的改变:
第一个更改涉及修改SecondPass
目标并在中添加额外的测试Condition
属性。如果您的项目甚至没有业务流程,此测试对于防止第二遍发生非常有用。
不幸的是,如果您的项目包含 Orchestration,则原始项目SecondPass
Target 删除中间程序集,然后继续编译 Orchestration。但是,那CompileODX
如果所有文件都已是最新的,则 Target 不需要运行。因此,第二个改变涉及移动Delete
任务来自SecondPass
目标为CompiledODX
Target.
这里的所有都是它的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)