アジョブジ星通信

進捗が出た頃に更新されるブログ。

NuGet.Protocol の使い方

テスト終わりました。色んな意味で。というわけで NuGet v3 を触るシリーズ続き行きます。

NuGet では新たに NuGet.Protocol というクライアントライブラリを開発しています。 Visual Studio 2015 の NuGet Package Manager もこれを使用しています。 API v2, v3 両対応なのですが、そのためなのか、テスト可用性のためなのか、なかなかソースコードが分離されていて読み解くのも面倒な上使うのも面倒なのでメモ。


SourceRepository の作成

まずリポジトリURI を指定して NuGet.Client.SourceRepository という v2, v3 を意識せずアクセスするためのインターフェイス的なクラスを作成します。手っ取り早い方法は、 NuGet.Client.RepositoryFactory を使うことです。

SourceRepository repo = RepositoryFactory.Create(NuGetConstants.V3FeedUrl);

NuGet.Configuration.NuGetConstants.V3FeedUrl の中身は "https://api.nuget.org/v3/index.json" です。同様に V2FeedUrl もあります。もちろん公式パッケージリポジトリ以外でもちゃんと動きます。

また、RepositoryFactory には v2 に限定した CreateV2 や、 v3 に限定した CreateV3 メソッドも存在します。

このとき内部では実行ファイルと同じディレクトリ(アセンブリがファイルでない場合は NuGet.Client.BaseType のディレクトリ)にある NuGet.*.dll ファイルを検索し(つまり NuGet.Protocol.V2V3 パッケージ内のアセンブリをここで読み込む)、 MEF でインポートしています。つまりディレクトリ構成が普通でないとエラーになるので注意してください。

RepositoryFactory のコメントに Do NOT use this from the VS Extension! とか書いてありますが気にしません。 NuGet.VisualStudioExtension ではもっと高度に MEF を使っているようです。 Service Locator を使った開発は大変そうですね……。

Resource の取得

API 群は Resource と呼ばれているようで、これを取得して API にアクセスします。 Resource は API の数だけあるので、オブジェクトブラウザでも眺めながらコードを書いてください。

参考までに
f:id:azyobuzin:20150310230427p:plain
f:id:azyobuzin:20150310230439p:plain

この型名を使って

var resource = repo.GetResource<HogeResource>();

// 非同期
var resource = await repo.GetResourceAsync<HogeResource>();

で取得し、これでやっと API を叩く準備が出来ました。 GetResource メソッド内では v2 か v3 かを識別したり、 APIURI を取得しに通信が発生するので非同期版が用意されています。

CoreTweet の最新バージョンは?

というわけでサンプルを。 CoreTweet の AppVeyor プロジェクトフィードから最新のバージョンを取得してくるコードです。

using System;
using System.Threading;
using NuGet.Client;

var repo = RepositoryFactory.Create("https://ci.appveyor.com/nuget/coretweet-pvq86631pp8l");
var metaRes = repo.GetResource<MetadataResource>();
var version = metaRes.GetLatestVersion(
    packageId: "CoreTweet",
    includePrerelease: true,
    includeUnlisted: false,
    token: CancellationToken.None
).Result;
Console.WriteLine(version);
0.4.2.97

というわけでこんな感じに便利に使えます。こちらからは以上です