我有一个构建过程在NAnt中,类似于以下结构(很多已被删除)。我对可以从我的NAnt脚本放入Workflow的内容以及我应该转换为MSBuild(或不是)的内容有所了解。 NAnt脚本中的各种目标将设置属性,复制文件,删除文件,调用外部进程(如编译VB6项目)。任何将此移植到工作流程的提示都将非常感激。如果您有任何疑问,请与我们联系。
<?xml ... >
<project ...>
<!-- Get and combine paths -->
<properties name="" value=""/>
<properties name="" value=""/>
<properties name="" value=""/>
.
.
.
.
<target name="Main">
<!--Set Log Folder Name to include date and time.
<mkdir dir="${LogDir}"/>
<call target="DeleteTicketsFile"/>
<call target="GetTickets"/>
<call target="WriteTicketsToFile"/>
<call target="WriteProperties"/>
<call target="DeleteFolders" failonerror="true"/>
<call target="GetLatest" failonerror="true"/>
<call target="BuildDOTNETSolution" failonerror="true"/>
<call target="BuildVB6Projects" failonerror="true"/>
.
.
.
<target name="BuildDOTNETSolution">
<property name="ProjectName" value="Localcache" />
<echo message="VCVarsAllBatFile = ${VCVarsAllBatFile}"/>
<exec program="${VCVarsAllBatFile}"/>
<property name="dotnetSlnFile" value="${path::combine(ProductDir, 'dot.net.sln')}"/>
<property name="dotnetOutFile" value="${path::combine(LogDir, 'dotnet.out.txt')}"/>
<echo message="dotnetSlnFile = ${dotnetSlnFile}"/>
<echo message="dotnetOutFile = ${dotnetOutFile}"/>
<delete file="${dotnetOutFile}" if="${file::exists(dotnetOutFile)}" failonerror="false"/>
<!-- Build .NET solution in Release mode -->
<exec program="${DevenvExe}">
<environment>
<variable name="COMSUPPORT" value="N"/>
<variable name="COPYEXECENV" value="N"/>
</environment>
<arg value='"${dotnetSlnFile}"'/>
<arg value='/Rebuild "Release|Any CPU"'/>
<arg value='/Out "${dotnetOutFile}"'/>
</exec>
</target>
</project>
答案 0 :(得分:3)
我的建议是完全替换NAnt并使用TFS Build Workflow来定制和维护您的构建。也就是说,如果您的NAnt脚本非常复杂,可能需要一些时间(特别是如果您是基于TFS Workflow的构建的新手)。我的建议是简单地让Workflow Build使用InvokeProcess Activity通过命令行(nant.exe)执行NAnt构建。然后,您可以逐步将构建的部分从NAnt脚本移动到工作流中。
例如,整个BuildDotNETSolution目标看起来没有做任何特殊的事情,所有这些都已包含在DefaultTemplate.xaml构建工作流中,您只需在构建定义中指定SolutionsToBuild参数。