2010-05-26 2 views
4

Я ищу некоторые быстрые способы сделать некоторые (более) сложные запросы, у кого есть то, что было проверено, и тому подобное (например, какие файлы имеют> 1 человек, выписанный).Могу ли я использовать объектную модель TFS для взаимодействия с TFS через F #?

Я изучал F # за последний год или около того и увидел потенциал использования как функциональных аспектов F # для быстрого создания полезных и сложных команд TFS.

Мне было интересно, если кто-либо еще это сделал, или у вас есть идеи о том, как я буду заниматься этим.

PS: Я использую TFS 2005.

Благодаря

Рассел

ответ

6

вам понадобится Visual Studio 2005 SDK, чтобы получить необходимые сборки. SDK также включает несколько примеров в C#, которые вы можете использовать в качестве ссылки, и некоторую документацию. Ничто не очень хорошо (IMHO), поэтому вам, вероятно, придется заниматься поиском.

Я написал следующий код как доказательство концепции, но это может помочь вам приступить к работе. Обратите внимание, что это написано в VS2010, поэтому вам, возможно, придется использовать операторы #I для ссылки на правильные сборки.

#light 
// #I @"C:\Program Files (x86)\Microsoft Visual Studio 2008 SDK\VisualStudioIntegration\Common\Assemblies\" 
#r "Microsoft.TeamFoundation" 
#r "Microsoft.TeamFoundation.Client" 
#r "Microsoft.TeamFoundation.WorkItemTracking.Client" 
#r "Microsoft.TeamFoundation.VersionControl.Client" 

open System 
open System.Collections.Generic 
open System.Net 
open Microsoft.TeamFoundation 
open Microsoft.TeamFoundation.Client 
open Microsoft.TeamFoundation.WorkItemTracking.Client 
open Microsoft.TeamFoundation.VersionControl.Client 


type TeamFoundationClient(uri, credentials : ICredentials) = 
    let server = new TfsTeamProjectCollection (Uri uri, credentials) 
    let workitemStore = server.GetService(typeof<WorkItemStore>) :?> WorkItemStore 
    let versionControlServer = server.GetService(typeof<VersionControlServer>) :?> VersionControlServer 

    member this.ExecuteQuery wiql = 
     workitemStore.Query(wiql) 
      |> Seq.cast<WorkItem> 

    member this.GetWorkItem id = 
     workitemStore.GetWorkItem (id : int) 

    member this.GetChangeset changesetUri = 
     versionControlServer.ArtifactProvider.GetChangeset (Uri changesetUri) 

    member this.GetChangesets (wi : WorkItem) = 
     let isChangeset (link : Link) = 
      match link with 
      | :? ExternalLink as link' when link'.LinkedArtifactUri.Contains("Changeset") -> Some (link') 
      | _ -> None 
     wi.Links 
      |> Seq.cast<Link> 
      |> Seq.choose isChangeset 
      |> Seq.map (fun l -> l.LinkedArtifactUri) 

    static member CreateCredentials (username : string) (password : string) (domain : string) = 
     (NetworkCredential (username, password, domain)) :> ICredentials 

// Huusom

+0

Спасибо, что это отличный старт. :) Я тоже использую VS2010, так что это еще упростит! Я попробую и посмотрю, как это происходит. – Russell

+1

На самом деле вам не нужен Visual Studio 2005 SDK. Необходимые сборки устанавливаются при установке клиента Team Explorer (или автоматически вместе с VS2010 Ultimate). – Robaticus

Смежные вопросы