在追逐增量构建时间改进的同时,我发现.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 pass构建有一个原因,但简直无法相信它不可能为目标指定适当的输入和输出来正确处理增量构建。
有没有人知道.targets文件是否有补丁,或者是否还有其他充分理由不支持增量版本?
答案 0 :(得分: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
内定义的原始目标非常相似。事实上,我做了两个简单的改动:
第一个更改涉及修改SecondPass
目标并在Condition
属性中添加额外测试。如果您的项目甚至没有Orchestrations,此测试可用于防止第二次传递。
不幸的是,如果您的项目包含业务流程,原始的SecondPass
目标将删除中间程序集,然后继续编译业务流程。但是,如果所有文件都是最新的,则CompileODX
目标不需要运行。因此,第二项更改涉及将Delete
任务从SecondPass
目标移至CompiledODX
目标。
这就是它的全部内容。
答案 1 :(得分:1)
这是我的团队在一段时间之前遇到的问题,只是简单地退出了自定义构建文件,而是选择了位于here的BizTalk部署框架。 BizTalk从VS级别做了许多“有趣”的事情,因为2009年是BizTalk没有使用外部构建过程的第一个版本。但我不确定为什么需要第二遍,除非从设计师的角度来看。