2011-02-07 18 views
5

Tenemos un proceso de compilación personalizado (sin utilizar MS Build) y durante ese proceso agrego una compilación "falsa" a la lista de compilaciones globales. La razón por la que estoy haciendo eso es para que pueda seleccionar la construcción para un elemento de trabajo determinado (que se encuentra en la compilación). Tenemos un campo personalizado, construcción incluida, que tiene como objetivo mostrar en qué construcción se ha corregido ese elemento de trabajo. Tengo problemas para averiguar cómo actualizar este campo mediante programación. La idea es que tendré una pequeña aplicación que haga esto a la que llamaré durante el proceso de compilación, encontrando todos los elementos de trabajo desde la última compilación, y luego actualizando el campo para esos elementos de trabajo. ¿Algunas ideas?Cómo actualizar un campo de TFS personalizado mediante programación

+0

¿Puede ser más específico acerca de lo global se basa lista de piezas. ¿Estás usando una plantilla de compilación personalizada (en Windows Workflow Foundation)? ¿Está agregando una variable o argumento en esa plantilla? – LWoodyiii

+0

Lo siento, estoy usando la lista global en TFS. No estoy usando una plantilla de compilación, estamos usando un producto llamado Automated Build Studio para la construcción propiamente dicha. Solo iba a escribir una aplicación independiente para llamar desde ABS para esta funcionalidad. – Nick

Respuesta

13

Algo como esto debería funcionar para usted:

public void UpdateTFSValue(string tfsServerUrl, string fieldToUpdate, 
    string valueToUpdateTo, int workItemID) 
{ 
    // Connect to the TFS Server 
    TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri(tfsUri)); 
    // Connect to the store of work items. 
    _store = (WorkItemStore)tfs.GetService(typeof(WorkItemStore)); 
    // Grab the work item we want to update 
    WorkItem workItem = _store.GetWorkItem(workItemId); 
    // Open it up for editing. (Sometimes PartialOpen() works too and takes less time.) 
    workItem.Open(); 
    // Update the field. 
    workItem.Fields[fieldToUpdate] = valueToUpdateTo; 
    // Save your changes. If there is a constraint on the field and your value does not 
    // meet it then this save will fail. (Throw an exception.) I leave that to you to 
    // deal with as you see fit. 
    workItem.Save();  
} 

Un ejemplo de llamar a esto sería:

UpdateTFSValue("http://tfs2010dev:8080/tfs", "Integration Build", "Build Name", 1234); 

La variable fieldToUpdate debe ser el nombre del campo, no el refname (es decir, . Integración Construir, no Microsoft.VSTS.Build.IntegrationBuild)

Probablemente pueda salirse con la suya usando PartialOpen(), pero no estoy seguro.

Es probable que necesite agregar Microsoft.TeamFoundation.Client a su proyecto. (Y tal vez Microsoft.TeamFoundation.Common)

+0

¡Gracias, esto es exactamente lo que estaba buscando! – Nick

+0

+1 ¿Te preguntas por qué esta respuesta nunca fue votada? –

+5

No estoy seguro si cambiaron algo o si todo el mundo se da cuenta de esto, pero debe hacer: workItem.Fields [fieldToUpdate] .Value en TFS 2012; de lo contrario, obtendrá un error sobre la colección de campo de solo lectura; –

4

Esto ha cambiado para TFS 2012, básicamente hay que añadir workItem.Fields [fieldToUpdate] .Value

versión actualizada de lo que escribió @Vaccano.

public void UpdateTFSValue(string tfsServerUrl, string fieldToUpdate, 
    string valueToUpdateTo, int workItemID) 
{ 
    // Connect to the TFS Server 
    TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri(tfsUri)); 
    // Connect to the store of work items. 
    _store = (WorkItemStore)tfs.GetService(typeof(WorkItemStore)); 
    // Grab the work item we want to update 
    WorkItem workItem = _store.GetWorkItem(workItemId); 
    // Open it up for editing. (Sometimes PartialOpen() works too and takes less time.) 
    workItem.Open(); 
    // Update the field. 
    workItem.Fields[fieldToUpdate].Value = valueToUpdateTo; 
    // Save your changes. If there is a constraint on the field and your value does not 
    // meet it then this save will fail. (Throw an exception.) I leave that to you to 
    // deal with as you see fit. 
    workItem.Save();  
} 
Cuestiones relacionadas