对于TFS 2010中的构建过程,我创建了一个包含一些自定义代码活动的库。 在过去,通过将库(* .dll)添加到源代码管理并将“构建控制器 - 自定义程序集的版本控制路径”设置为可在源代码管理中找到库的路径,一切正常。
但是几天后(我经常更新库),构建不再成功。 报告的错误是:
TF215097:发生错误 初始化构建版本 定义“不能创造未知 输入'{clr-namespace:BuildTasks; assembly = BuildTasks}'“
在searching之后,除了将库安装到GAC之外,我找不到任何其他解决方案。这有效,但我想知道为什么不必安装到GAC就无法工作。
因此,虽然它现在再次运行,但我希望在没有GAC的情况下以旧方式恢复工作。希望你们中的一些人可以帮助我。提前谢谢。
答案 0 :(得分:9)
如果要指定包含您编写的自定义代码活动的程序集,则需要执行以下操作:
此时,您有一个自定义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" #>
<#
//relative path to the DLL for your custom assembly in source control
var filename = this.Host.ResolvePath("..\\..\\..\\..\\BuildAssemblies\\BuildTasks.dll");
Version buildInfoAssemblyVersion = AssemblyName.GetAssemblyName(filename).Version;
// Setup the version information. Using the DateTime object make it kinda unique
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;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("BuildTasks")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("BuildTasks")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("feab7e26-0830-4e8f-84c1-774268727cbd")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
// Version information is a combination of DateTime.Now and an incremented revision number coming from the file:
// <#= filename #>
[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或类似的东西)。
答案 1 :(得分:8)
此解决方案可能不适用于所有情况,因为之前帖子中提供的答案是正确的,但不是我的问题的解决方案。这个答案假设如下:
我和(我怀疑很多其他人)正在做的是复制或将他们的xaml工作流文档链接到解决方案中,以便您可以使用工作流设计器和新的自定义程序集。嗯,这在VS设计器中很有用,但是VS会用它自己修改你的程序集引用。例如,我有一个如下所示的引用:
xmlns:ca="clr-namespace:Custom.TFS.Activities;assembly=Custom.TFS.Activities"
使用我的项目解决方案编辑工作流程后,visual studio将其更改为:
xmlns:local="clr-namespace:Custom.TFS.Activities"
当您检查此文件以进行测试或使用时,您现在将看到可怕的TF215097错误。
添加;assembly=your.assembly
应解决问题,并且无需将所有内容都放在GAC中。您可能还需要在xaml文件的其余部分中修复名称空间引用。
答案 2 :(得分:6)
您需要在codeActivity类上使用此属性:
&LT; BuildActivity(HostEnvironmentOption.All)GT; _
在其他地方,未加载程序集。
答案 3 :(得分:2)
如Rhapsody在2010年6月2日所述,可以使用GAC。但是需要注意的是,如果您使用GAC,则需要停止并重新启动构建服务,以便重新扫描GAC,从而获取您的DLL。
我最初在GAC中注册了我的DLL,当我启动指向由我的自定义代码活动程序集组成的工作流的构建时,构建失败。但是在停止并重新启动构建服务之后,构建不会立即失败,因为可怕的“初始化构建定义的构建时发生错误[BuildDefinitionName]:无法创建未知类型......”。
答案 4 :(得分:1)
这对我有用 - 程序集名称需要包含在自定义控件的名称空间声明中:
答案 5 :(得分:1)
我今天没有找到这个问题的答案,所以对于你们中的一些人来说,这个答案可能来得太晚了。
我真的被困在尝试从GAC做同样的事情,修改名称空间声明,我总是找到着名的“无法创建未知类型”{clr-namespace:bla,bla,bla“。每次添加新程序集时修改所有构建模板都是一种痛苦而烦人的体验。我通过在GAC中设置程序集遇到了一些问题,看起来有某种缓存,因为即使我从GAC卸载并重新安装程序集,自定义活动也没有刷新,
最后,我在http://msdn.microsoft.com/en-us/library/ee330987.aspx中发现,您可以通过将自定义程序集添加到源代码管理并在“构建控制器属性”中设置自定义程序集的控制路径来添加自定义程序集(您可以从Team Foundation管理控制台访问 - &gt;构建配置 - &gt;控制器属性)
你只需要将你的程序集添加到源代码控制中,TFS就会关注所有内容。
答案 6 :(得分:1)
我有同样的问题。原因是我使用针对x86平台的自定义活动编译了库,而构建控制器运行的是64位Windows 2008 VM。将目标平台切换到AnyCPU允许构建控制器立即使用库,而无需将其添加到GAC。
答案 7 :(得分:1)
我需要的修复是创建我的类的部分类定义,并将BuildActivity属性应用于它。我的问题是我错过了我的活动类的BuildActivity属性,因为我已经在松散的Xaml中实现了它而不是作为代码活动,所以这为我修复了它。
据说,Team Build会加载包含BuildActivity或BuildExtension类的任何程序集,理论上这应该会导致所有程序集中的任何类都可用于构建。这将启用一种虚拟加载器类,允许加载Xaml活动而不需要这些部分类定义,但实际上这对我不起作用。
答案 8 :(得分:1)
检查您的Windows事件通知。您的自定义活动DLL可能没有正确加载。
如果没有,那么您可能必须更改自定义活动项目的平台目标...要么是32位还是64位。
答案 9 :(得分:0)
由于没有给出答案而且我没有找到任何解决办法,我现在决定加入GAC。 这也有效。 :)
答案 10 :(得分:0)
上面提到的属性是:
Microsoft.TeamFoundation.Build.Client.BuildActivity( Microsoft.TeamFoundation.Build.Client.HostEnvironmentOption.Agent )
一般来说,TF215097看起来真的很像“你的东西坏了”,而不仅仅是“我找不到它”。
答案 11 :(得分:0)
如果您错误地为不同版本的TFS混合构建扩展,则会出现此错误的另一个来源。例如,如果您使用TFS 2012但尝试使用TFS 2013 build extensions,则会收到此错误。
答案 12 :(得分:0)
我在这个帖子中的其他答案都没有取得任何成功,但是我想我会分享我的所作所为。我的自定义程序集通过GAC加载到我的构建计算机上。我不得不手动打开构建模板XAML文件并将我的程序集添加到命名空间引用。出于某种原因,Visual Studio并没有为我正确引用它。
在:
xmlns:ba1="clr-namespace:BuildTasks.Activities"
在
xmlns:ba1="clr-namespace:BuildTasks.Activities;assembly=ModifyTasks"
我的自定义构建任务程序集名为ModifyTasks.dll,用您自己的文件名替换它......
答案 13 :(得分:0)
我重新启动TFS 2012构建服务器后遇到了同样的问题。运行完全正常的CI作业停止使用提到的TF215097错误,它无法找到自定义活动。
对此页面的评论(https://social.msdn.microsoft.com/Forums/vstudio/en-US/479449e1-5c02-4744-b620-3bba64038cef/custom-build-activity-tf215097-cannot-create-unknown-type?forum=tfsbuild)建议删除构建控制器配置中自定义活动DLL的设置源路径,保存更新的配置,重新添加相同的路径并再次保存。
这解决了我的问题。