TFS 2010自定义生成活动TF215097错误

时间:2010-05-26 07:43:52

标签: .net build-automation tfs2010

对于TFS 2010中的构建过程,我创建了一个包含一些自定义代码活动的库。 在过去,通过将库(* .dll)添加到源代码管理并将“构建控制器 - 自定义程序集的版本控制路径”设置为可在源代码管理中找到库的路径,一切正常。

但是几天后(我经常更新库),构建不再成功。 报告的错误是:

  

TF215097:发生错误   初始化构建版本   定义“不能创造未知   输入'{clr-namespace:BuildTasks; assembly = BuildTasks}'“

searching之后,除了将库安装到GAC之外,我找不到任何其他解决方案。这有效,但我想知道为什么不必安装到GAC就无法工作。

因此,虽然它现在再次运行,但我希望在没有GAC的情况下以旧方式恢复工作。希望你们中的一些人可以帮助我。提前谢谢。

14 个答案:

答案 0 :(得分:9)

如果要指定包含您编写的自定义代码活动的程序集,则需要执行以下操作:

  1. 将自定义活动构建到 你的工作流程
  2. 确保你的 定义了顶部的xmlns 正确: 的xmlns:本地= “CLR-名称空间:BuildTasks;装配= BuildTasks”
  3. 确保XAML中的标签 构建过程具有本地(或 你使用的任何前缀) 正确。
  4. 将更新的工作流程XAML签入您的团队项目并更新您的构建定义。
  5. 在团队项目中创建名为“CustomBuildAssemblies”
  6. 的新目录
  7. 转到用于创建自定义构建任务的项目的bin / Debug(或release)文件夹(基本上获取您放入GAC的dll)并将其放入步骤5中创建的目录中
  8. 通过转到Team Exporer告诉构建控制器在哪里查找自定义程序集,选择要执行此操作的项目,展开项目列表并右键单击“Builds”,然后选择“Manage Build Controllers” 。选择控制器(应该是列表中的第一件事)并单击属性。将版本控制路径设置为在步骤5中创建的目录(位于弹出窗口的中间)。
  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)

此解决方案可能不适用于所有情况,因为之前帖子中提供的答案是正确的,但不是我的问题的解决方案。这个答案假设如下:

  1. 自定义解决方案程序集在签入时都已更改,并且已正确标记和构建。
  2. 构建控制器已指向自定义程序集的正确源控制位置。
  3. 我和(我怀疑很多其他人)正在做的是复制或将他们的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文件的其余部分中修复名称空间引用。

    非常感谢: http://msmvps.com/blogs/rfennell/archive/2010/03/08/lessons-learnt-building-a-custom-activity-to-run-typemock-isolator-in-vs2010-team-build.aspx

答案 2 :(得分:6)

您需要在codeActivity类上使用此属性:

&LT; BuildActivity(HostEnvironmentOption.All)GT; _

在其他地方,未加载程序集。

答案 3 :(得分:2)

如Rhapsody在2010年6月2日所述,可以使用GAC。但是需要注意的是,如果您使用GAC,则需要停止并重新启动构建服务,以便重新扫描GAC,从而获取您的DLL。

我最初在GAC中注册了我的DLL,当我启动指向由我的自定义代码活动程序集组成的工作流的构建时,构建失败。但是在停止并重新启动构建服务之后,构建不会立即失败,因为可怕的“初始化构建定义的构建时发生错误[BuildDefinitionName]:无法创建未知类型......”。

答案 4 :(得分:1)

这对我有用 - 程序集名称需要包含在自定义控件的名称空间声明中:

http://blogs.microsoft.co.il/blogs/royrose/archive/2010/06/09/custom-build-activities-and-tf215097-error.aspx

答案 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的设置源路径,保存更新的配置,重新添加相同的路径并再次保存。

这解决了我的问题。