我可以使用TFS对象模型通过F#与TFS交互吗?

时间:2010-05-26 04:45:26

标签: tfs f#

我正在寻找一些快速的方法来做一些(更多)复杂的查询,查看谁签出了什么以及类似的东西(例如,哪些文件有> 1人签出)。

过去一年左右我一直在学习F#,并且看到了使用F#的功能方面来快速创建一些有用且更复杂的TFS命令的潜力。

我想知道是否有其他人这样做了,或者对如何做到这一点有任何想法。

PS:我正在使用TFS 2005。

由于

罗素

1 个答案:

答案 0 :(得分:6)

您需要Visual Studio 2005 SDK来获取所需的程序集。 SDK还包括C#中的一些示例,您可以将它们用作参考,以及一些dokumentation。两者都不是很好(恕我直言)所以你可能不得不做一些谷歌搜索。

我编写了以下代码作为概念证明,但它可能会帮助您入门。请注意,这是在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