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