そもそもの発端はMSBuildでのビルドプロセス中に、TFSのソース管理に対していくつか操作したいと思った事に始まります。
標準のタスクにはなさそうですし、カスタムタスク集の「MSBuild Community Tasks*1」にもいい感じのがありません。
最悪はTF.exeをExecタスクから呼ぶことも考えたのですが、今一つスマートさに欠ける気がするのでこれは最終手段ということで保留。
いろいろ調べていると、.NET Framework向けにMicrosoft.TeamFoundation名前空間で色々と機能が提供されていることを知りました。
Microsoft.TeamFoundation名前空間
これを使って.NETの言語からTFSの機能にアクセスできるのであれば、後はカスタムタスクの形に作ってしまえばいいので、MSBuildから呼び出すのも楽そうです。
ちょうどMSDNにサンプルがあったこともあり、実現したかったことの一つである『TFSでチェックアウト中(”保留中のチェックイン”)のファイルの一覧』の取得をやってみました。
ポイントを書いてみたいと思います。
ポイント1:参照設定の追加
プロジェクトの参照設定に以下の二つを加えます。
- Microsoft.TeamFoundation.Client
- Microsoft.TeamFoundation.VersionControl.Client
ポイント2:TFSへの接続
TFSへの接続は以下のコードで書けばよいようです。
var tfsCollectionAddress = @"<serveraddress:portnumber>/<TeamCollectionName>"; var tfs = new TfsTeamProjectCollection( new Uri (tfsCollectionAddress), new UICredentialsProvider ()); tfs.EnsureAuthenticated();
ポイント3:ソース管理サービスへの参照を取得
TfsTeamProjectCollectionクラスのGetServiceメソッドを使い、ソース管理サービスへの参照をVersionControlServerのインスタンスとして取得します。
var versionControl = (VersionControlServer )tfs.GetService( typeof( VersionControlServer ));
ポイント4:QueryPendingSetsメソッドを使って『保留中のチェックイン』を取得
QueryPendingSetsメソッドを使って、『保留中のチェックイン』の一覧を取得します。
このメソッドにはいくつかオーバーロードがあるようですが、今回はこちらの引数3つのオーバーロードを利用することにします。
引数は以下の模様
- ItemSpec[] itemSpecs,
- 対象のアイテム(フォルダ)を示す、ItemSpecの配列を設定します。
- string queryWorkspaceName
- string queryUserName
- チェックアウトユーザ名で絞りたいとき、指定します。ユーザを対象とするのであればから文字列でよいようです。
特定のフォルダの配下で現在チェックアウト中のファイルを、ワークスペース/ユーザを問わずに取得する場合は以下のようになります。
var itemSpecs = new ItemSpec[1]; itemSpecs[0] = new ItemSpec ( @"$/TestProject1", RecursionType .Full); var pendingSets = versionControl.QueryPendingSets(itemSpecs,"","");
戻り値はpendingSetの配列になります。例えば、こんな具合にすればファイルの一覧を列挙できます。
var sb = new StringBuilder(); foreach (var ps in pendingSets) { foreach (var pc in ps.PendingChanges) { sb.AppendLine(pc.FileName); } }
サンプルソース
上記を実装してみたサンプルソースをアップしておきます。
https://skydrive.live.com/redir?resid=BEAD9BC2511BDF7F!1928