我想执行的TFS生成过程以下步骤:
- 做后生成事件会从我的编译的项目的一些文件复制到另一个预定义的目录,我想该目录路径包括分支名称。
- 我想可以参考分支的名字我的XAML工作流模板内为好。
我想执行的TFS生成过程以下步骤:
第一个是相当简单的。 当你使用新的TFS 2013生成服务器和流程模板,你可以简单的构建定义配置中添加一个生成后PowerShell脚本,检查脚本和生成过程中运行它。
第二个是取决于您是否使用TFVC或Git的,在第一种情况下,使用VersionControlServer类查询BranchObjects,然后检查哪一个是你的工作文件夹的根目录。 要知道,虽然,在TFVC多个分支可以在一个工作区中引用的,所以可能有多种回答这个查询,具体取决于哪个文件使用找到branchroot。 自定义CodeActivity会做的伎俩,类似这种检查在自定义签入策略 。
该代码将类似于:
IBuildDetail buildDetail = context.GetExtension<IBuildDetail>();
var workspace = buildDetail.BuildDefinition.Workspace;
var versionControlServer = buildDetail.BuildServer.TeamProjectCollection.GetService<VersionControlServer>();
var branches = versionControlServer.QueryRootBranchObjects(RecursionType.Full);
var referencedBranches = listOfFilePaths.GroupBy(
file =>
branches.SingleOrDefault(
branch => file.ServerItem.StartsWith(branch.Properties.RootItem.Item)
)
).Where(group => group.Key != null);
为了获得哟工作区的所有项目的列表,你可以使用Workspace.GetItems
。
如果你使用Git,你有几个选项,以及。 最简单的是调用命令行 :
git symbolic-ref --short HEAD
或潜入LibGit2Sharp并用它来查找基于从自定义活动当前工作文件夹中的分支名称。
如果您要包括这在MSBuild任务,这很可能是可能的。 它会有点远,对于这个答案完全勾勒出所需的步骤,但一旦你知道该怎么做它并不难。
创建调用上面的代码相同的片段自定义的MSBuild任务 ,而不是获取访问通过工作区虽然BuildDetail.BuildDefinition.Workspace
,但通过WorkStation
类 :
Workstation workstation = Workstation.Current;
WorkspaceInfo info = workstation.GetLocalWorkspaceInfo(path);
TfsTeamProjectCollection collection = new TfsTeamProjectCollection(info.ServerUri);
Workspace workspace = info.GetWorkspace(collection);
VersionControlServer versionControlServer = collection.GetService<VersionControlServer>();
一旦任务已经创建,您可以创建自定义.targets
通过当构建完成覆盖某些变量或复制数据挂接到的MSBuild进程文件。 你可以连接到多个目标,并确定是否需要之前或之后他们做一些事情。
您可以<import>
这些您的每一个项目,或者你可以将其放置在ImportAfter
或ImportBefore
您的MSBuild版本的文件夹,使之在全球范围加载。 你可以在这里找到该文件夹:
C:\Program Files (x86)\MSBuild\{MsBuild Version}\Microsoft.Common.Targets\ImportAfter