共用方式為


NuGet 用戶端 SDK

NuGet 用戶端 SDK 是指一組 NuGet 套件:

您可以在 NuGet/NuGet.Client GitHub 存放庫中找到這些套件的原始程式碼。

備註

如需 NuGet 伺服器通訊協定的檔,請參閱 NuGet 伺服器 API

支援原則

最新版本的 NuGet 用戶端 SDK 完全受支援,而且可以依賴來修正錯誤、更新和增強功能。

建議使用最新版本的 NuGet 用戶端 SDK 套件,並檢查您的專案是否有已取代的 NuGet 用戶端 SDK 套件相依性。

修補程式版本

NuGet 用戶端 SDK 的修補版本只會在長期支援 (LTS) 版本的 Visual Studio 或 .NET SDK 需要重大錯誤或安全性修正時發行。

所有安全性錯誤都應該在 MSRC 的報告頁面向 Microsoft 安全性回應中心 (MSRC) 回報。 此外,請參閱 NuGet.Client 存放庫中的安全性原則

我們不保證 API 的穩定性,因為我們團隊的職責是工具,而不是函式庫。 如需詳細資訊,請參閱 NuGet.Client 存放庫中的 NuGet SDK 檔

套件被棄用

未繫結至 Visual Studio 或 .NET 的 LTS 版本的不支援 NuGet 用戶端 SDK 套件將在 nuget.org 上取代

NuGet 的套件維護方法將與 .NET 套件維護 (淘汰) 指引一致。

NuGet.通訊協定

安裝 NuGet.Protocol 套件以與 HTTP 和資料夾型 NuGet 套件來源互動:

dotnet add package NuGet.Protocol

您可以在 GitHub 上的 NuGet.Protocol.Samples 專案中找到這些範例的原始程式碼。

小提示

Repository.Factory 是在 NuGet.Protocol.Core.Types 命名空間中定義的,GetCoreV3 方法是擴充方法,定義在 NuGet.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 搜尋 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 推送套件:

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 刪除套件:

備註

NuGet 伺服器可以自由地將套件刪除要求解譯為「硬刪除」、「虛刪除」或「取消列出」。 例如,nuget.org 將套件刪除請求視為「取消顯示」。 如需此做法的詳細資訊,請參閱刪除 套件 原則。

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

安裝 NuGet.Packaging 套件以用來與串流中的 .nupkg.nuspec 檔案互動:

dotnet add package NuGet.Packaging

建立套件

建立套件、設定中繼資料,以及使用 NuGet.Packaging新增相依性。

這很重要

強烈建議您使用官方 NuGet 工具來建立 NuGet 套件, 而不是 使用此低階 API。 對於格式良好的套件來說,有各種重要的特性,而最新版本的工具有助於整合這些最佳實踐。

如需建立 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}");
}

第三方文件

您可以在 Dave Glick 於 2016 年發佈的下列部落格系列中找到部分 API 的範例和檔:

備註

這些部落格文章是在 NuGet 用戶端 SDK 套件 3.4.3 版本發行後不久撰寫的。 較新版本的套件可能與部落格文章中的資訊不相容。

Martin Björkström 對 Dave Glick 的部落格系列進行了後續部落格文章,其中介紹了使用 NuGet 用戶端 SDK 安裝 NuGet 套件的不同方法: