如何:自定义内部版本号
更新:2007 年 11 月
您可以通过自行创建生成过程中运行的自定义任务来自定义 Team Foundation Build。本主题介绍使用生成版本号的任务来自定义 Team Foundation Build 生成定义时必须遵循的步骤。
先决条件
在创建自定义内部版本号的任务之前,您必须具备以下条件:
访问要进行自定义的生成定义的 TFSBuild.proj 文件的权限。
TFSBuild.proj 文件可以与一个以上生成定义相关联。若要确定 TFSBuild.proj 文件的源代码管理位置,请在团队资源管理器的“生成”文件夹中选择生成定义,右击该生成定义,然后单击“编辑”。TFSBuild.proj 文件的源代码管理位置显示在“生成定义”对话框的“项目文件”窗格上。默认情况下,TFSBuild.proj 文件位于Team Foundation 版本控制的 $/MyTeamProject/TeamBuildTypes/MyBuildName 文件夹中。MyTeamProject 是团队项目的名称,也是所有团队项目源代码的根节点。MyBuildName 是您为与 TFSBuild.proj 文件关联的第一个生成定义指定的名称。有关如何创建 Team Foundation Build 生成类型的更多信息,请参见如何:创建生成定义。
重要说明: 自定义 TFSBuild.proj 文件时,需要自定义与该文件相关的每个生成定义。
一个位于本地计算机上的本地工作区,其中包含团队项目文件和生成文件。
有关更多信息,请参见如何:创建映射的工作区和如何:获取团队项目的源代码。
必需的权限。
若要执行此任务,您的“管理生成”和“管理工作区”的权限必须设置为“允许”。还必须将“签入”和“签出”权限设置为“允许”。有关更多信息,请参见 Team Foundation Server 权限。
编写内部版本号任务
若要编写任务,您可以直接实现 ITask 接口,或者从帮助器类 Task 派生您自己的类。ITask 在 Microsoft.Build.Framework.dll 程序集中定义;Task 在 Microsoft.Build.Utilitites.dll 程序集中定义。
若要自定义由 Team Foundation Build 生成的内部版本号,您必须将所编写的任务插入到 BuildNumberOverrideTarget 目标。BuildNumberOverrideTarget 要求具有一个名为 BuildNumber. 的输出属性 (Property)。Output 属性 (Attribute) 表示此属性 (Property) 是您的自定义任务的输出。有关 Team Foundation Build 目标的更多信息,请参见可自定义的 Team Foundation Build 目标。
编写自定义任务
创建一个包含自定义任务的名为 MyTask 的 Visual C# 类库。
有关更多信息,请参见组件类。
在“项目”菜单上单击“添加引用”,再从“添加引用”对话框中选择“Microsoft.Build.Framework”和“Microsoft.Build.Utilities”。
将以下代码插入到 class.cs 文件。
本示例是从 Task 帮助器类继承的,并使用 DateTime 属性 UtcNow 和 Ticks 来产生内部版本号。
using System; using Microsoft.Build.Utilities; using Microsoft.Build.Framework; namespace BuildNumberGenerator { public class BuildNumberGenerator:Task { public override bool Execute() { m_buildNumber = DateTime.UtcNow.Ticks.ToString(); return true; } private string m_buildNumber; [Output] public string BuildNumber { get { return m_buildNumber; } } } }
生成类库以得到 MyTask.dll。
将生成的 dll 复制到本地工作区文件夹,此文件夹中还包含您的生成定义的 TFSBuild.proj 文件。
重要说明: 必须先将 TFSBuild.proj 文件的源代码管理位置映射到本地工作区,此目录结构才会在客户端计算机上存在。有关更多信息,请参见如何:获取团队项目的源代码。
如果您的 TFSBuild.proj 文件存储在源代码管理的默认文件夹中,则该文件的本地副本位于客户端计算机上的“<根目录>:\本地工作区\TeamBuildTypes\MyBuildName”目录下。本地工作区是将团队项目映射到其中的本地文件夹;MyTeamProject 是团队项目的名称;MyBuildName 是为与此 TFSBuild.proj 文件关联的第一个生成定义指定的名称。
将 dll 文件添加到源代码管理
创建了包含自定义任务的 dll 之后,必须将其添加到 Team Foundation 版本控制。可以使用 tf add 和 tf checkin 命令,将 dll 添加并签入到您的生成定义的 TFSBuild.proj 文件所在的位置。有关更多信息,请参见 Add 命令和 Checkin 命令。
添加并签入程序集
单击“开始”,依次指向“所有程序”、“Microsoft Visual Studio 9.0”和“Visual Studio Tools”,然后单击“Visual Studio 2008 命令提示”。打开为以下团队项目映射的本地工作区:该团队项目中包含要自定义的生成类型。
例如,在命令提示符下键入以下命令。
> cd c:\MyTeamProject
其中 MyTeamProject 是您的团队项目的名称。
移动到 TFSBuild.proj 文件存储的位置。
例如,在命令提示符下键入以下命令。
c:\MyTeamProject>cd TeamBuildTypes\MyBuildName
其中 MyBuildName 是生成定义的名称。
若要将文件添加到 Team Foundation 版本控制,请键入以下命令。
c:\MyTeamProject\TeamBuildTypes\MyBuildName> tf add MyTask.dll
若要将文件签入到 Team Foundation 版本控制,请键入以下命令。
c:\MyTeamProject\TeamBuildTypes\MyBuildName> tf checkin MyTask.dll
可以使用团队资源管理器将 dll 添加到 Team Foundation 版本控制 中。有关更多信息,请参见如何:向版本控制添加项目或解决方案。
注册任务
创建任务之后,必须通过在 TFSBuild.proj 文件的 UsingTask 元素中指定该任务来注册它。UsingTask 元素会将该任务映射到包含该任务的实现的程序集。有关更多信息,请参见 UsingTask 元素 (MSBuild)。
通过修改 TFSBuild.proj 文件来注册任务
启动 Visual Studio。
从 Team Foundation 版本控制签出要修改的 TFSBuild.proj 文件,并在 Visual Studio XML 编辑器中将其打开。
将 UsingTask 元素添加到 TFSBuild.proj 文件中紧随导入 (import) 语句的位置。
<UsingTask TaskName="BuildNumberGenerator.BuildNumberGenerator" AssemblyFile="MyTask.dll"/>
若要将任务插入到 BuildNumberOverrideTarget 目标,请将包含在 <Target></Target> 标签中的以下 XML 添加到 TFSBuild.proj 文件的结尾处。
</ItemGroup> <Target Name = "BuildNumberOverrideTarget" > <BuildNumberGenerator> <Output TaskParameter="BuildNumber" PropertyName="BuildNumber"/> </BuildNumberGenerator> </Target> </Project>
单击“文件”,再单击“保存”以保存更改,然后关闭 TFSBuild.proj。
说明: 在对 TFSBuild.proj 文件进行这些修改之后,您将接收到 XML 架构警告。您可以放心地忽略这些警告。
将 TFSBuild.proj 再签入回源代码管理。
修改完 TFSBuild.proj 文件并将更改保存到 Team Foundation 版本控制之后,运行生成定义。
有关更多信息,请参见如何:启动生成定义或对其进行排队。
可以在 生成资源管理器 中查看自定义内部版本号。有关更多信息,请参见如何:监视生成过程。