銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

VSTS 拡張を作ってみる (3) : 設定データの管理

今回は設定などのデータをVSTSのサービス上に保存する仕組みを紹介します。

前回までと違って、今回はこのサイトに載っている情報の通りで動きます。

Data and Setting Storage | Extensions for Visual Studio Team Services

VSTS拡張はVSTSのサービス上にデータを保存・取得ができます。保存できるデータは

  • Key-Value 型の単純な設定の保存
  • JSON オブジェクトといったドキュメントの保存

の2通りが選べ、またデータ保存のスコープとして、

  • Project Collection単位。デフォルト。
  • ログインしているユーザー単位

の2通りが選べます。

Key-Value型の管理

setValuegetValueメソッドでキーの取得と保存ができます。Keyの名前は文字列で指定します。また、第3引数に{scopeType: "User"}を指定することでデータ保存のスコープがユーザー単位になります。

VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService) {
        dataService.setValue("userSettingKey1", 12345, {scopeType: "User"}).then(function(value) {
                console.log("User scoped key value is " + value);
        });
});
VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService) {
        dataService.getValue("userSettingKey1", {scopeType: "User"}).then(function(value) {
                console.log("User scoped key value is " + value);
        });
});

Document単位の管理

JSON型のオブジェクトを保存できます。ドキュメントを複数格納するコレクションというものに名前を付けることができ、その下に保存するドキュメントはidで管理します。idは保存するドキュメントのプロパティとして渡すことができるのですが、呼び出すメソッドによって次のように挙動が変わります。

メソッド idを指定して、そのidが存在しない idを指定して、そのidがすでに存在する idを指定しない
createDocument 指定したidで、そのドキュメントを保存する エラー 新規にidを指定してそのドキュメントを保存する
setDocument 指定したidで、そのドキュメントを保存する 既存のドキュメントを指定したドキュメントで更新する 新規にidを指定してそのドキュメントを保存する
updateDocument エラー 既存のドキュメントを指定したドキュメントで更新する エラー

setDocumentはUpsertみたいな動きをします。

保存して、さらに取得するコードはこんな感じになります。

VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService) {
        var newDoc = {
                values : [{
                        name: "group1",
                        definitions: [1,3,4]
                },{
                        name: "group2",
                        definitions: [2,5]
                },
        ]};
        
        dataService.createDocument("BuildGroups", newDoc).then(function(doc) {
                console.log("Doc id: " + doc.id);
                VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService) {
                        dataService.getDocument("BuildGroups", doc.id).then(function(doc) {
                                console.log(doc); 
                        });
                });
        });
});

コレクション名を指定して保存されているドキュメント一覧を取得することはできます。

VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService) {
        dataService.getDocuments("BuildGroups").then(function(docs) {
                console.log("There are " + docs.length + " in the collection.");
                docs.forEach(function(doc){
                        console.log(doc);
                })
        });
});

その一方、そのプロジェクトに保存してあるコレクション一覧というものはqueryCollectionNamesといったメソッドで取得できそうですが、このメソッドは引数に名前を指定しないといけないので、一覧を取得することはできなさそうです。