NuGet クライアント SDK

NuGet クライアント SDK は、NuGet パッケージのグループをリファレンスします。

  • NuGet.Indexing - Visual Studio クライアント検索機能用の NuGet のインデックス作成ライブラリ。
  • NuGet.Commands - コマンド ライン クライアントと GUI NuGet クライアントに共通のコマンドを完了します。
  • NuGet.Common - すべての NuGet ライブラリの一般的なユーティリティとインターフェイス。
  • NuGet.Configuration - NuGet の構成セットの実装。
  • NuGet.Credentials - NuGet クライアント認証モデル。
  • NuGet.DependencyResolver.Core - NuGet の PackageReference 依存関係リゾルバーの実装。
  • NuGet.Frameworks - ターゲット フレームワークに対する NuGet の解釈。
  • NuGet.LibraryModel - 依存関係を解釈するための NuGet のTYPEとインターフェイス。
  • NuGet.Localization - NuGet ローカライズ パッケージ。
  • NuGet.PackageManagement - Visual Studio インストール フロー用の NuGet パッケージ マネージャー機能。
  • NuGet.Packaging - ストリームからの.nupkg.nuspecファイルとやり取 りする API セットを提供。 NuGet.Protocol はこのパッケージに依存します。
  • NuGet.ProjectModel - ロックされたファイル、アセット ファイル、内部復元モデルなど、PackageReference ベースの復元用の NuGet のコアTYPEとインターフェイス。
  • NuGet.Protocol - 一連の API が HTTP およびファイル ベースの NuGet フィードと対話できるようにします。
  • NuGet.Resolver - packages.config ベースのプロジェクトに対する NuGet の依存関係リゾルバー。
  • NuGet.Versioning - NuGet のセマンセマンティック バージョニング管理の実装。

これらのパッケージのソース コードは、NuGet/NuGet.Client GitHub リポジトリにあります

Note

NuGet サーバー プロトコルのドキュメントについては、NuGet サーバー API参照してください。

サポート ポリシー

のセキュリティ バグは、MSRC のレポート ページから、Microsoft Security Response Center (MSRC) に報告する必要があります。 また、「NuGet.Client リポジトリのセキュリティ ポリシー」も参照してください。

チームはライブラリではなくツールの扱いに責任を負うため、API の安定性は保証しかねます。 詳細については、「NuGet.Client リポジトリ の NuGet SDK ドキュメント」を参照してください。

NuGet.Protocol

HTTP とフォルダーベースの NuGet パッケージ フィードと対話するNuGet.Protocolパッケージをインストールします。

dotnet add package NuGet.Protocol

これらの例のソース コードは、GitHub の NuGet.Protocol.Samples プロジェクトにあります。

ヒント

Repository.FactoryNuGet.Protocol.Core.Types名前空間で定義され、メソッド GetCoreV3NuGet.Protocol名前空間で定義された拡張メソッドです。 そのため、両方の名前空間のステートメントを追加 using する必要があります。

パッケージのバージョンリスト

NuGet V3 パッケージ コンテンツ API を使用して、Newtonsoft.Json のすべてのバージョンを検索します。

ILogger logger = NullLogger.Instance;
CancellationToken cancellationToken = CancellationToken.None;

SourceCacheContext cache = new SourceCacheContext();
SourceRepository repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
FindPackageByIdResource resource = await repository.GetResourceAsync<FindPackageByIdResource>();

IEnumerable<NuGetVersion> versions = await resource.GetAllVersionsAsync(
    "Newtonsoft.Json",
    cache,
    logger,
    cancellationToken);

foreach (NuGetVersion version in versions)
{
    Console.WriteLine($"Found version {version}");
}

パッケージのダウンロード

NuGet V3 パッケージ コンテンツ API を使用して Newtonsoft.Json v12.0.1 をダウンロード。

ILogger logger = NullLogger.Instance;
CancellationToken cancellationToken = CancellationToken.None;

SourceCacheContext cache = new SourceCacheContext();
SourceRepository repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
FindPackageByIdResource resource = await repository.GetResourceAsync<FindPackageByIdResource>();

string packageId = "Newtonsoft.Json";
NuGetVersion packageVersion = new NuGetVersion("12.0.1");
using MemoryStream packageStream = new MemoryStream();

await resource.CopyNupkgToStreamAsync(
    packageId,
    packageVersion,
    packageStream,
    cache,
    logger,
    cancellationToken);

Console.WriteLine($"Downloaded package {packageId} {packageVersion}");

using PackageArchiveReader packageReader = new PackageArchiveReader(packageStream);
NuspecReader nuspecReader = await packageReader.GetNuspecReaderAsync(cancellationToken);

Console.WriteLine($"Tags: {nuspecReader.GetTags()}");
Console.WriteLine($"Description: {nuspecReader.GetDescription()}");

パッケージメタデータ取得

NuGet V3 パッケージ メタデータ APIを使用して、"Newtonsoft.Json" パッケージのメタデータを取得します。

ILogger logger = NullLogger.Instance;
CancellationToken cancellationToken = CancellationToken.None;

SourceCacheContext cache = new SourceCacheContext();
SourceRepository repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
PackageMetadataResource resource = await repository.GetResourceAsync<PackageMetadataResource>();

IEnumerable<IPackageSearchMetadata> packages = await resource.GetMetadataAsync(
    "Newtonsoft.Json",
    includePrerelease: true,
    includeUnlisted: false,
    cache,
    logger,
    cancellationToken);

foreach (IPackageSearchMetadata package in packages)
{
    Console.WriteLine($"Version: {package.Identity.Version}");
    Console.WriteLine($"Listed: {package.IsListed}");
    Console.WriteLine($"Tags: {package.Tags}");
    Console.WriteLine($"Description: {package.Description}");
}

パッケージの検索

NuGet V3 Search API を使用して "json" パッケージを検索します。

ILogger logger = NullLogger.Instance;
CancellationToken cancellationToken = CancellationToken.None;

SourceRepository repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
PackageSearchResource resource = await repository.GetResourceAsync<PackageSearchResource>();
SearchFilter searchFilter = new SearchFilter(includePrerelease: true);

IEnumerable<IPackageSearchMetadata> results = await resource.SearchAsync(
    "json",
    searchFilter,
    skip: 0,
    take: 20,
    logger,
    cancellationToken);

foreach (IPackageSearchMetadata result in results)
{
    Console.WriteLine($"Found package {result.Identity.Id} {result.Identity.Version}");
}

パッケージをプッシュする

NuGet V3 プッシュ API と Delete API使用してパッケージをプッシュします。

ILogger logger = NullLogger.Instance;
CancellationToken cancellationToken = CancellationToken.None;

SourceCacheContext cache = new SourceCacheContext();
SourceRepository repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
PackageUpdateResource resource = await repository.GetResourceAsync<PackageUpdateResource>();

string apiKey = "my-api-key";

await resource.Push(
    "MyPackage.nupkg",
    symbolSource: null,
    timeoutInSecond: 5 * 60,
    disableBuffering: false,
    getApiKey: packageSource => apiKey,
    getSymbolApiKey: packageSource => null,
    noServiceEndpoint: false,
    skipDuplicate: false,
    symbolPackageUpdateResource: null,
    logger);

パッケージを削除する

NuGet V3 プッシュ API と Delete API を使用してパッケージを削除します。

Note

NuGet サーバーは、パッケージ削除要求を "ハード削除"、"論理的な削除"、または "リストから削除" として自由に解釈できます。 例えば、nuget.org はパッケージ削除要求を "unlist" と解釈します。 この方法の詳細については、「パッケージ削除」ポリシーを参照してください。

ILogger logger = NullLogger.Instance;
CancellationToken cancellationToken = CancellationToken.None;

SourceCacheContext cache = new SourceCacheContext();
SourceRepository repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
PackageUpdateResource resource = await repository.GetResourceAsync<PackageUpdateResource>();

string apiKey = "my-api-key";

await resource.Delete(
    "MyPackage",
    "1.0.0-beta",
    getApiKey: packageSource => apiKey,
    confirm: packageSource => true,
    noServiceEndpoint: false,
    logger);

認証されたフィードを使用する

認証されたフィードで作業するためにNuGet.Protocol を使用する

ILogger logger = NullLogger.Instance;
CancellationToken cancellationToken = CancellationToken.None;
SourceCacheContext cache = new SourceCacheContext();
var sourceUri = "https://contoso.privatefeed/v3/index.json";
var packageSource = new PackageSource(sourceUri)
{
    Credentials = new PackageSourceCredential(
        source: sourceUri,
        username: "myUsername",
        passwordText: "myVerySecretPassword",
        isPasswordClearText: true,
        validAuthenticationTypesText: null)
};
// If the `SourceRepository` is created with a `PackageSource`, the rest of APIs will consume the credentials attached to `PackageSource.Credentials`.
SourceRepository repository = Repository.Factory.GetCoreV3(packageSource);
PackageMetadataResource resource = await repository.GetResourceAsync<PackageMetadataResource>();

IEnumerable<IPackageSearchMetadata> packages = await resource.GetMetadataAsync(
    "MyPackage",
    includePrerelease: true,
    includeUnlisted: false,
    cache,
    logger,
    cancellationToken);

foreach (IPackageSearchMetadata package in packages)
{
    Console.WriteLine($"Version: {package.Identity.Version}");
    Console.WriteLine($"Listed: {package.IsListed}");
    Console.WriteLine($"Tags: {package.Tags}");
    Console.WriteLine($"Description: {package.Description}");
}

NuGet.Packaging

ストリームから.nupkg.nuspecファイルと対話するNuGet.Packagingパッケージをインストールします。

dotnet add package NuGet.Packaging

パッケージを作成する

NuGet.Packagingを使用してパッケージを作成し、メタデータを設定し、依存関係を追加します。

重要

この低レベルの API を使用せず、公式の NuGet ツールを使用して NuGet パッケージを作成することを強くお勧めします。 整形式パッケージにはさまざまな特性が重要であり、最新バージョンのツールは、これらのベスト プラクティスを組み込むのに役立ちます。

NuGet パッケージの作成の詳細については、パッケージ作成ワークフロー概要と公式パック ツールのドキュメントを参照してください (例えば、dotnet CLI を使用)。

PackageBuilder builder = new PackageBuilder();
builder.Id = "MyPackage";
builder.Version = new NuGetVersion("1.0.0-beta");
builder.Description = "My package created from the API.";
builder.Authors.Add("Sample author");
builder.DependencyGroups.Add(new PackageDependencyGroup(
    targetFramework: NuGetFramework.Parse("netstandard1.4"),
    packages: new[]
    {
        new PackageDependency("Newtonsoft.Json", VersionRange.Parse("10.0.1"))
    }));

using FileStream outputStream = new FileStream("MyPackage.nupkg", FileMode.Create);
builder.Save(outputStream);
Console.WriteLine($"Saved a package to {outputStream.Name}");

パッケージ読み取り

を使用してファイル ストリームからパッケージを NuGet.Packaging読み取ります。

using FileStream inputStream = new FileStream("MyPackage.nupkg", FileMode.Open);
using PackageArchiveReader reader = new PackageArchiveReader(inputStream);
NuspecReader nuspec = reader.NuspecReader;
Console.WriteLine($"ID: {nuspec.GetId()}");
Console.WriteLine($"Version: {nuspec.GetVersion()}");
Console.WriteLine($"Description: {nuspec.GetDescription()}");
Console.WriteLine($"Authors: {nuspec.GetAuthors()}");

Console.WriteLine("Dependencies:");
foreach (var dependencyGroup in nuspec.GetDependencyGroups())
{
    Console.WriteLine($" - {dependencyGroup.TargetFramework.GetShortFolderName()}");
    foreach (var dependency in dependencyGroup.Packages)
    {
        Console.WriteLine($"   > {dependency.Id} {dependency.VersionRange}");
    }
}

Console.WriteLine("Files:");
foreach (var file in reader.GetFiles())
{
    Console.WriteLine($" - {file}");
}

サード パーティのドキュメント

一部の API の例とドキュメントは、2016 年に公開された Dave Glick の次のブログ シリーズにあります。

Note

これらのブログ投稿は、NuGet クライアント SDK パッケージの 3.4.3 バージョンがリリースされた直後に書かれています。 新しいバージョンのパッケージは、ブログ記事の情報と互換性がない可能性があります。

Martin Björkström は Dave Glick のブログ シリーズのフォローアップ ブログ投稿を行い、NuGet クライアント SDK を使用して NuGet パッケージをインストールする別のアプローチを紹介しました。