2010-05-26 25 views
16

Para el proceso de compilación en TFS 2010, he creado una biblioteca que contiene algunas actividades de código personalizado. En el pasado, todo funcionó bien al agregar la biblioteca (* .dll) al control de código fuente y configurar el 'Controlador de compilación - Ruta de control de versiones a ensamblajes personalizados' a la ruta donde se podía encontrar la biblioteca en el Control de código fuente.Actividad de compilación personalizada de TFS 2010 Error TF215097

Pero desde hace unos días (y he estado actualizando la biblioteca a menudo) la construcción ya no funciona. El error reportado es:

TF215097: Se ha producido un error al inicializar una acumulación de acumulación definición "No se puede crear desconocida tipo '{clr-namespace: BuildTasks; montaje = BuildTasks}'"

Después de searching no pude encontrar ninguna otra solución aparte de instalar la biblioteca en el GAC. Eso funciona, pero me pregunto por qué es imposible hacerlo funcionar sin tener que instalarlo en el GAC.

Así que, aunque funciona de nuevo ahora, me gustaría que vuelva a funcionar de la manera antigua, sin GAC. Espero que algunos de ustedes puedan ayudarme. Gracias por adelantado.

Respuesta

0

Como no se ha dado ninguna respuesta y no he encontrado ninguna solución, decidí poner el GAC ahora. Eso funciona también. :)

+0

Vi que esto se revivió hoy. De hecho, estaba haciendo el trabajo administrativo de TFS en una nueva caja ayer y estaba configurando un nuevo conjunto de BuildTasks. Si todavía está buscando una solución mejor, responda y puedo agregar algunos otros consejos que puede probar para mi respuesta. O, si lo has entendido desde entonces, háznoslo saber. –

+0

Encontré que también versionar el ensamblado BuildTasks cada vez que lo revisas ayuda a resolver el problema. –

1

Esto funcionó para mí - el nombre del ensamblado debe ser incluido en la declaración de espacio de nombres para el control personalizado:

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

+0

Gracias por su respuesta, he comprobado el archivo XAML y vieron que el nombre de ensamblado ya estaba incluido: xmlns: b = "clr-namespace: BuildTasks; montaje = BuildTasks" Pero voy a tratar de jugar con él una un poco más. – Rhapsody

9

Si desea especificar ensamblados que contienen actividades de código personalizado que' Si ha escrito lo siguiente, debe hacer lo siguiente:

  1. Cree sus actividades personalizadas en su flujo de trabajo.
  2. Asegúrese de que sus xmlns en la parte superior se define correctamente: xmlns: Local = "clr-namespace: BuildTasks; montaje = BuildTasks"
  3. Asegúrese de que las etiquetas en el XAML para el proceso de construcción tienen los locales (o sea cual sea el prefijo que haya usado) correctamente.
  4. Incorpore su flujo de trabajo actualizado XAML en su proyecto de equipo y actualice sus definiciones de compilación.
  5. crear un nuevo directorio en su proyecto de equipo llamado "CustomBuildAssemblies"
  6. Ir a la bin/Depuración (o liberación) carpeta del proyecto que utilizó para crear la estructura de encargo tareas (básicamente obtener la DLL que eres poner en el GAC) y colocarlo en el directorio creado en el paso 5.
  7. Indique al controlador de desarrollo dónde buscar los ensamblajes personalizados yendo a Team Exporer, seleccionando el proyecto para el que está haciendo esto, expanda la lista de proyectos y haga clic derecho en "Builds", y seleccione "Manage Build Controllers". Selle el controlador (debe ser lo primero en la lista) y haga clic en Propiedades. Establezca la ruta de control de la versión en el directorio que se creó en el paso 5 (ubicado en el medio de la ventana emergente).

En este punto, tiene un flujo de trabajo XAML personalizado que hace referencia (importa) un ensamblaje personalizado (o varios) que se han incluido en el control de código fuente. El controlador de compilación ahora sabe dónde se encuentran estos conjuntos personalizados. Esto le permite "registrar" nuevas versiones de esos conjuntos personalizados si alguna vez necesita agregar/actualizar sus tareas de compilación personalizadas.

Espero que esto te ayude. Me tomó algo de tiempo resolver esto también. Avíseme si necesito que esto sea más detallado. Me gustaría poder publicar algunas capturas de pantalla de los diálogos.

ACTUALIZACIÓN: Me olvidé por completo de este hilo hasta que vi que se revivió. También puedo actualizar esta respuesta, ya que he encontrado una muy buena manera de hacer que TFS extraiga la última versión de su ensamblado de tareas de compilación personalizado: crear un número de versión único para el ensamblaje.

Utilizo una plantilla T4 y la ejecuto antes de construir el conjunto. Actualiza AssemblyInfo.cs después de leer la DLL de actividad personalizada registrada.

<#@ 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")] 

Se dará cuenta en la parte inferior I también configurar las definiciones de espacio de nombres XML para cada uno de los espacios de nombres que utilizo en el flujo de trabajo. Descubrí que el XMAL generado se ve mucho más limpio y también me ayuda con mis problemas.

Creé este archivo como AssemblyInfo.tt y simplemente me aseguro de ejecutarlo (haga clic con el botón derecho y seleccione ejecutar T4 o algo así) antes de construir el conjunto.

+3

Thansk por su respuesta, pero lo hice exactamente de la manera que describió. Al principio también estaba funcionando, pero de repente se detuvo. Pero acepté la solución alternativa; al instalar el ensamblado de actividad de código personalizado en el GAC, funciona. :) No tengo tiempo para descubrirlo y funciona ahora. – Rhapsody

6

usted necesita este atributo en la clase CodeActivity:

< BuildActivity (HostEnvironmentOption.All)> _

Por otra parte, la asamblea no se carga.

+1

Parece que el error informado podría tener una multitud de causas, esta lo arregló por mí. –

+0

se corrigió también para mí – scorpio

0

El atributo mencionado anteriormente es:

Microsoft.TeamFoundation.Build.Client.BuildActivity(Microsoft.TeamFoundation.Build.Client.HostEnvironmentOption.Agent) 

En general, lo que realmente parece como TF215097 puede significar "estás cosas se rompe" no sólo "no podía encontrarlo".

1

No he encontrado una respuesta a este problema hasta hoy, por lo que probablemente esta respuesta llegue demasiado tarde para algunos de ustedes.

Estaba realmente atrapado tratando de hacer lo mismo desde GAC, modificando la declaración del espacio de nombres y siempre encontraba el famoso "No se puede crear el tipo desconocido" {clr-namespace: bla, bla, bla ". Modificar todas las plantillas de compilación cada vez que puede agregar un nuevo conjunto es una experiencia dolorosa y molesta. He experimentado algunos problemas estableciendo el ensamblado en GAC, parece que hay algún tipo de caché porque las actividades personalizadas no se actualizaron incluso si desinstalé y reinstalé el ensamblaje de GAC,

Finalmente, encontré en http://msdn.microsoft.com/en-us/library/ee330987.aspx que puede agregue ensamblados personalizados con actividades personalizadas agregándolos a Source Control y estableciendo la ruta de control para ensambles personalizados en Build Controller Properties (puede acceder desde Team Foundation Administration Console -> Build Configuration -> Controller Properties)

Solo necesita para agregar sus ensambles al control de fuente y TFS se ocupará de todo.

2

Según lo mencionado por Rhapsody el 2 de junio de 2010, se puede usar el GAC.Sin embargo, debe tenerse en cuenta que si utiliza el GAC, debe detener y reiniciar el servicio de compilación, de modo que vuelva a escanear el GAC y, por lo tanto, recupere su DLL.

había registrado inicialmente mi DLL en la GAC, y cuando me quité una acumulación que apuntaba a un flujo de trabajo consistente en mi actividad de montaje de código personalizado, la acumulación fallado. Pero después de detener y reiniciar el servicio de compilación, la compilación no falla inmediatamente con el temido error "Se produjo un error al inicializar una compilación para la definición de compilación [BuildDefinitionName]: no se puede crear un tipo desconocido ...".

8

Esta solución no se aplica a todos los casos, ya que las respuestas proporcionadas en críticas anteriores son correctas, pero no eran la solución a mi problema. Esta respuesta asume lo siguiente:

  1. los conjuntos de soluciones personalizadas se cambian en el ingreso y se etiquetan y construyen correctamente.
  2. El controlador de construcción ha sido señalado en el punto de control de fuente correcta para los ensamblados personalizados.

Lo que yo y (sospecho que muchos otros) estamos haciendo es copiar o vincular sus documentos de flujo de trabajo xaml a la solución para que pueda usar el diseñador de flujo de trabajo y los nuevos conjuntos personalizados. Bueno, esto funciona muy bien en el diseñador de VS, pero VS modificará las referencias de su conjunto con las suyas propias. Por ejemplo, tengo una referencia que tiene el siguiente aspecto:

xmlns:ca="clr-namespace:Custom.TFS.Activities;assembly=Custom.TFS.Activities" 

Después de editar el flujo de trabajo con mi solución del proyecto, el estudio visual cambió eso a:

xmlns:local="clr-namespace:Custom.TFS.Activities" 

Al revisar este archivo a prueba o utilizar, ahora verá el temido error TF215097.

Adición de la ;assembly=your.assembly debería solucionar el problema y eliminar la necesidad de poner todo en la GAC. Es posible que también necesite corregir las referencias de espacios de nombres usando en el resto del archivo xaml.

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

+1

La porción "; assembly = BuildTasks" se elimina de XMLNS si la tarea de compilación está en el mismo proyecto que el flujo de trabajo XAML que está editando. El uso de dos proyectos separados (uno para editar la plantilla de compilación y otro para crear actividades de compilación personalizadas) resuelve este problema y le permite editar el flujo de trabajo en el diseñador al tener que editar manualmente el XAML después de cada cambio. – JRS

1

tenía este mismo problema. La razón fue que había compilado la biblioteca con las actividades personalizadas contra la plataforma x86 y el controlador de compilación se estaba ejecutando en una máquina virtual de Windows 2008 de 64 bits. Cambiar la plataforma de destino a AnyCPU permitió al controlador de compilación utilizar de inmediato la biblioteca sin tener que agregarla al GAC.

+0

¡Bienvenido a Stack Overflow! Tenga cuidado cuando publique copiar y pegar respuestas al pie de página o verbatim a preguntas múltiples, estas tienden a ser señaladas como "basura" por la comunidad. Si está haciendo esto, generalmente significa que las preguntas son duplicadas, por lo tanto, márquelas como tales. – Kev

1

La solución que necesitaba era crear una definición de clase parcial de mi clase, y aplicar el atributo BuildActivity a ella. Mi problema era que me estaba perdiendo el atributo BuildActivity en mi clase de actividad, ya que lo había implementado en Xaml suelto y no como una actividad de código, así que esto lo solucionó.

Supuestamente, Team Build carga cualquier ensamblaje que contenga una clase con BuildActivity o BuildExtension y, en teoría, esto debería dar como resultado que cualquier clase de dicho ensamblado esté disponible para la compilación. Esto habría habilitado un tipo de clase de cargador ficticio que permitiría la carga de actividades Xaml sin necesidad de estas definiciones parciales de clase, pero en la práctica eso no funcionó para mí.

1

Revise las notificaciones de eventos de Windows. Es posible que su DLL de actividad personalizada NO se haya cargado correctamente.

Si no fue así, es posible que tenga que cambiar el objetivo de la plataforma de su proyecto de actividad personalizada ... ya sea a 32 bits o a 64 bits.

0

Otra fuente de este error si por error se mezclan las extensiones de compilación para diferentes versiones de TFS. Por ejemplo, si está utilizando TFS 2012, pero intente utilizar TFS 2013 build extensions, obtendrá este error.

0

No he tenido ningún éxito con las otras respuestas en este hilo, sin embargo, pensé en compartir lo que hice. Mi ensamblaje personalizado se cargó en mi máquina de compilación a través de GAC. Tuve que abrir manualmente el archivo XAML de la plantilla de compilación y agregar mi ensamblado a la referencia del espacio de nombres. Por alguna razón, Visual Studio no estaba haciendo referencia a esto de manera adecuada para mí.

Antes:

xmlns:ba1="clr-namespace:BuildTasks.Activities" 

Después

xmlns:ba1="clr-namespace:BuildTasks.Activities;assembly=ModifyTasks" 

Mi ensamblado de tarea de generación personalizada se llama ModifyTasks.dll sustituir con su propio nombre de archivo ...

0

me encontré con el mismo problema después de un reinicio de nuestro servidor de compilación TFS 2012. Un trabajo de CI que funcionaba perfectamente bien dejó de funcionar con el error TF215097 mencionado, no pudo encontrar una actividad personalizada.

Un comentario en esta página (https://social.msdn.microsoft.com/Forums/vstudio/en-US/479449e1-5c02-4744-b620-3bba64038cef/custom-build-activity-tf215097-cannot-create-unknown-type?forum=tfsbuild) sugirió eliminar la ruta de origen establecida para las DLL de actividad personalizada en la configuración del controlador de compilación, guardar la configuración actualizada, volver a agregar la misma ruta y guardar de nuevo.

Esto me solucionó el problema.

Cuestiones relacionadas