【发布时间】:2014-09-16 18:31:10
【问题描述】:
自定义构建活动取决于以下 TFS 程序集:
Microsoft.TeamFoundation.Build.Client.dll
Microsoft.TeamFoundation.Build.Workflow.dll
Microsoft.TeamFoundation.VersionControl.Client.dll
我们的目标是编译它,使其可以在 TFS 2010、TFS 2012 和 TFS 2013 上运行,而无需为所有可能调用该活动的构建代理机器手动指定绑定重定向。
与活动一起提供配置文件并创建使用该配置文件中指定的绑定重定向的应用程序域似乎是一种选择,但这最终不起作用,因为“Microsoft.TeamFoundation.Build.Client.BuildActivity " 在执行自定义活动的程序集中的代码之前,调用代码将读取活动必须用 * 装饰的属性 - 如果该属性来自的 TFS 程序集的版本与 TFS 程序集的版本不匹配加载到内存中时,活动就像根本没有用那个属性修饰一样好。
(*我已经确认如果自定义activity没有用BuildActivity属性修饰,自定义activity的类型无法创建,构建失败。)
删除对 TFS 活动的所有引用并使用反射加载与 TFS 相关的类型似乎也是另一种选择,但由于同样的原因会失败,因为显然 BuildActivity 属性不能在类本身的代码之前反射性地应用于类由外部代码调用。
由于 TFS 2010、TFS 2012 和 TFS 2013 程序集中存在活动所依赖的少数 TFS 类型和方法,并且由于活动是针对 .NET 4.0 编译的,所以我能想到的唯一合理的解决方法是创建 3 个单独的构建:一个针对 TFS/VS 2010 (10.0.0.0) 程序集编译,一个针对 TFS/VS 2012 (11.0.0.0) 程序集编译,一个针对 TFS/VS 2013 (12.0.0.0) 程序集编译。
(当然,虽然我的开发机器上有上述程序集的 TFS2010/TFS2012/TFS2013 版本,但假设构建代理将仅具有其 TFS 版本附带的那些程序集的版本。 )
另一种解决方法似乎是为所有构建代理机器指定绑定重定向,但是对于相当多的构建代理机器,这是不可行的。
这个问题是否有实际的解决方案,还是我不得不创建 3 个构建?
【问题讨论】:
标签: visual-studio workflow-foundation-4