2011-02-07 3 views
5

Nous avons un processus de construction personnalisé (n'utilisant pas MS Build) et pendant ce processus j'ajoute une construction "fake" à la liste des builds globaux. La raison pour laquelle je fais cela est que vous pouvez sélectionner la construction pour un élément de travail donné (trouvé dans la construction). Nous avons un champ personnalisé, build inclus, qui est destiné à montrer dans quelle construction cet élément de travail a été corrigé. Je n'arrive pas à trouver comment mettre à jour ce champ par programmation. L'idée est que je vais avoir une petite application qui fait cela que j'appellerai pendant le processus de construction, en trouvant tous les éléments de travail depuis la dernière construction, puis en mettant à jour le champ pour ces éléments de travail. Des idées?Comment mettre à jour un champ TFS personnalisé par programmation

+0

Pouvez-vous être plus précis sur la partie de la liste des builds globaux. Utilisez-vous un modèle de construction personnalisé (dans Windows Workflow Foundation)? Ajoutez-vous une variable ou un argument dans ce modèle? – LWoodyiii

+0

Désolé, j'utilise la liste globale dans TFS. Je n'utilise pas de modèle de construction, nous utilisons un produit appelé Automated Build Studio pour la construction proprement dite. J'allais juste écrire une application autonome pour appeler de l'ABS pour cette fonctionnalité. – Nick

Répondre

13

Quelque chose comme cela devrait fonctionner pour vous:

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 exemple d'appeler ce serait:

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

La fieldToUpdate variable doit être le nom du champ, pas le refname (c.-à- Integration Build, et non Microsoft.VSTS.Build.IntegrationBuild)

Vous pourriez probablement partir en utilisant PartialOpen(), mais je ne suis pas sûr. Vous devrez probablement ajouter Microsoft.TeamFoundation.Client à votre projet. (Et peut-être Microsoft.TeamFoundation.Common)

+0

Merci, c'est exactement ce que je cherchais! – Nick

+0

+1 Demande pourquoi cette réponse n'a jamais été élue? –

+5

Vous ne savez pas si elles ont changé quelque chose ou si tout le monde comprend cela, mais vous devez faire: workItem.Fields [fieldToUpdate] .Valeur dans TFS 2012 sinon vous obtiendrez une erreur sur la collection de champs en cours de lecture; –

4

Cela a changé pour TFS 2012, basiquement vous devez ajouter workItem.Fields [fieldToUpdate] .Value

Version mise à jour de ce qu'écrit @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();  
} 
Questions connexes