如果你想指定包含你编写的自定义代码活动的程序集,需要按照以下步骤操作:
- 将你的自定义活动构建到工作流中。
- 确保顶部的xmlns被正确定义:xmlns:local="clr-namespace:BuildTasks;assembly=BuildTasks"。
- 确保在构建过程的XAML标记中,所使用的本地(或任何你惯用的前缀)是正确的。
- 将更新后的工作流XAML检入你的团队项目,并更新你的构建定义。
- 在你的团队项目中创建一个名为“CustomBuildAssemblies”的新目录。
- 进入用于创建自定义构建任务的项目的bin/Debug(或release)文件夹,并将其中的dll文件(即你要放在GAC中的dll)放入步骤5中创建的目录中。
- 通过 Team Exporer 去告诉构建控制器在哪里查找自定义程序集,选择你正在进行此操作的项目,在项目列表中展开并右键单击“构建”,然后选择“管理构建控制器”;选择控制器(应该是列表中的第一项),然后点击属性。将版本控制路径设置为步骤5中创建的目录(位于弹出窗口的中间)。
此时,你有一个引用(导入)已包含在源代码控制中的自定义程序集(或多个)的自定义XAML工作流。构建控制器现在知道这些自定义程序集的位置。这使你可以“检入”新版本的自定义程序集,以便添加/更新自定义构建任务。
希望这会对你有所帮助。我也花了一些时间才弄明白这个过程。如果需要更详细的解释,请告诉我。但我很遗憾不能上传一些对话框的截图。
更新:
我完全忘记了这个主题,直到看到它被重新启动。我还可以更新此答案,因为我找到了一种非常好的方法,可以让TFS拉取你的自定义构建任务程序集的最新版本:为程序集创建一个唯一的版本号。
我使用T4模板,并在构建程序集之前运行它。它在读取已检入的自定义活动DLL之后更新AssemblyInfo.cs。
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml.dll" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Reflection" #>
<#@ output extension=".cs" #>
<#
var filename = this.Host.ResolvePath("..\\..\\..\\..\\BuildAssemblies\\BuildTasks.dll");
Version buildInfoAssemblyVersion = AssemblyName.GetAssemblyName(filename).Version;
var version = new Version(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, buildInfoAssemblyVersion.Revision + 1);
#>
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows.Markup;
[assembly: AssemblyTitle("BuildTasks")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("BuildTasks")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("feab7e26-0830-4e8f-84c1-774268727cbd")]
[assembly: AssemblyVersion("<#= version.ToString() #>")]
[assembly: AssemblyFileVersion("<#= version.ToString() #>")]
[assembly: XmlnsDefinition("http://localhost/BuildTasks/Activities", "BuildTasks.Activities")]
[assembly: XmlnsDefinition("http://localhost/BuildTasks/Activities/InstallerA", "BuildTasks.Activities.InstallerA")]
[assembly: XmlnsDefinition("http://localhost/BuildTasks/Activities/InstallerB", "BuildTasks.Activities.InstallerB")]
[assembly: XmlnsDefinition("http://localhost/BuildTasks/Activities/CodeAnalysis", "BuildTasks.Activities.CodeAnalysis")]
[assembly: XmlnsDefinition("http://localhost/BuildTasks/Activities/Standards", "BuildTasks.Activities.Standards")]
[assembly: XmlnsDefinition("http://localhost/BuildTasks/Activities/CI", "BuildTasks.Activities.CI")]
[assembly: XmlnsDefinition("http://localhost/BuildTasks/Activities/Version", "BuildTasks.Activities.Version")]
您会注意到底部我还设置了每个工作流中使用的命名空间的XML命名空间定义。我发现生成的XMAL看起来更清晰,并且这也有助于解决我的问题。
我将此文件创建为AssemblyInfo.tt,只需确保在构建程序集之前运行它(右键单击并选择运行T4或类似选项)即可。