Catalog

カタログは、作成や削除など、パッケージ ソースに対するすべてのパッケージ操作を記録するリソースです。 サービス インデックスでのカタログ リソースの種類は Catalog です。 このリソースを使用して、発行されたすべてのパッケージに対してクエリを実行できます。

Note

カタログは公式の NuGet クライアントでは使用されないため、すべてのパッケージ ソースがカタログを実装しているわけではありません。

Note

現時点では、中国で nuget.org カタログを使用することはできません。 詳細については「NuGet/NuGetGallery#4949」を参照してください。

バージョン管理

次の @type 値が使用されます。

@type 値 メモ
Catalog/3.0.0 初期リリース

ベース URL

次の API のエントリ ポイント URL は、前述のリソースの @type 値に関連付けられている @id プロパティの値です。 このトピックでは、プレースホルダー URL {@id} を使用します。

HTTP メソッド

カタログ リソースにあるすべての URL は、HTTP メソッド GET および HEAD のみをサポートしています。

カタログ インデックス

カタログ インデックスは、カタログ アイテムのリストが時系列に並べられた既知の場所にあるドキュメントです。 これは、カタログ リソースのエントリ ポイントです。

インデックスはカタログ ページで構成されます。 各カタログ ページにはカタログ アイテムが含まれています。 各カタログ アイテムは、特定の時点での 1 つのパッケージに関するイベントを表します。 カタログ アイテムでは、作成、リスト解除、再リスト、またはパッケージ ソースから削除されたパッケージを表すことができます。 カタログ アイテムを時系列順に処理することで、クライアントは V3 パッケージ ソースに存在するすべてのパッケージの最新のビューを作成できます。

手短に言うと、カタログ BLOB には次の階層構造があります。

  • インデックス: カタログのエントリ ポイント。
  • ページ: カタログ アイテムのグループ。
  • リーフ: 1 つのパッケージの状態のスナップショットである、カタログ アイテムを表すドキュメント。

各カタログ オブジェクトには、アイテムがカタログに追加された日時を表す commitTimeStamp と呼ばれるプロパティが含まれます。 カタログ アイテムは、コミットと呼ばれるバッチでカタログ ページに追加されます。 同じコミット内のすべてのカタログ アイテムには、同じコミット タイムスタンプ (commitTimeStamp) および コミット ID (commitId) があります。 同じコミットに配置されたカタログ アイテムは、パッケージ ソースで同じ時点に発生したイベントを表します。 カタログのコミット内に順序はありません。

各パッケージ ID とバージョンは一意であるため、1 つのコミットに複数のカタログ アイテムが存在することはありません。 これにより、コミット タイムスタンプに基づき、1 つのパッケージのカタログ アイテムを常に明確に並べ替えできます。

1 つの commitTimeStamp カタログに対して複数のコミットが存在することはありません。 言い換えると、commitIdcommitTimeStamp と重複します。

パッケージ ID でインデックスが作成されるパッケージ メタデータ リソースとは異なり、カタログは時間によってのみインデックスが作成されます。また、時間によってのみクエリ可能です。

カタログ アイテムは常に、単調に増加する時系列順にカタログに追加されます。 つまり、時刻 X にカタログのコミットが追加されている場合、その後コミットが時刻 X またはそれより早い時間に追加されることはありません。

次のリクエストでは、カタログ インデックスをフェッチします。

GET {@id}

カタログ インデックスは、次のプロパティを持つオブジェクトを含む JSON ドキュメントです。

名前 タイプ 必須 メモ
commitId string はい 最新のコミットに関連付けられている一意の ID
commitTimeStamp string はい 最新のコミットのタイムスタンプ
count 整数 (integer) はい インデックス内のページ数
項目 オブジェクトの配列 はい それぞれが 1 ページを表すオブジェクトの配列

items 配列内の各要素は、各ページに関する最小限の詳細を持つオブジェクトです。 これらのページのオブジェクトには、カタログ リーフ (アイテム) は含まれません。 この配列内の要素の順序は定義されません。 ページは、commitTimeStamp プロパティを使用してメモリ内でクライアントにより並べ替えできます。

新しいページが導入されると、count はインクリメントされ、items 配列に新しいオブジェクトが表示されます。

カタログにアイテムが追加されると、インデックスの commitId が変更され、commitTimeStamp が増加します。 これら 2 つのプロパティは、基本的に items 配列内のすべてのページの commitId および commitTimeStamp 値の概要です。

インデックス内のカタログ ページ オブジェクト

カタログ インデックスの items プロパティに含まれるカタログ ページ オブジェクトには、次のプロパティがあります。

名前 タイプ 必須 メモ
@id string はい カタログ ページをフェッチする URL
commitId string はい このページの最新のコミットに関連付けられている一意の ID
commitTimeStamp string はい このページの最新のコミットのタイムスタンプ
count 整数 (integer) はい カタログ ページのアイテムの数

場合によってリーフをインデックスにインライン化するパッケージ メタデータ リソースとは異なり、カタログ リーフはインデックスにインライン化されることはなく、ページの @id URL を使用して常にフェッチする必要があります。

要求のサンプル

GET https://api.nuget.org/v3/catalog0/index.json

応答のサンプル

{
  "commitId": "3d698852-eefb-48ed-8f55-9ee357540d20",
  "commitTimeStamp": "2017-10-31T23:33:17.0954363Z",
  "count": 3,
  "items": [
    {
      "@id": "https://api.nuget.org/v3/catalog0/page0.json",
      "commitId": "3a4df280-3d86-458e-a713-4c91ca261fef",
      "commitTimeStamp": "2015-02-01T06:30:11.7477681Z",
      "count": 540
    },
    {
      "@id": "https://api.nuget.org/v3/catalog0/page1.json",
      "commitId": "8bcd3cbf-74f0-47a2-a7ae-b7ecc50005d3",
      "commitTimeStamp": "2015-02-01T06:39:53.9553899Z",
      "count": 540
    },
    {
      "@id": "https://api.nuget.org/v3/catalog0/page2.json",
      "commitId": "3d698852-eefb-48ed-8f55-9ee357540d20",
      "commitTimeStamp": "2017-10-31T23:33:17.0954363Z",
      "count": 47
    }
  ]
}

カタログ ページ

カタログ ページは、カタログ アイテムのコレクションです。 これは、カタログ インデックスにある @id 値のいずれかを使用してフェッチされるドキュメントです。 カタログ ページへの URL は予測可能なものではなく、カタログ インデックスのみを使用して検出する必要があります。

新しいカタログ アイテムは、コミット タイムスタンプが最も大きいカタログ インデックス内のページ、または新しいページに追加されます。 新しいコミット タイムスタンプのページがカタログに追加された時点で、それより古いページに追加や変更は行われなくなります。

カタログ ページ ドキュメントは、次のプロパティを持つ JSON オブジェクトです。

名前 タイプ 必須 メモ
commitId string はい このページの最新のコミットに関連付けられている一意の ID
commitTimeStamp string はい このページの最新のコミットのタイムスタンプ
count 整数 (integer) はい ページ内のアイテムの数
項目 オブジェクトの配列 はい このページのカタログ アイテム
string はい カタログ インデックスへの URL

items 配列内の各要素は、カタログ アイテムに関する最小限の詳細を持つオブジェクトです。 これらのアイテム オブジェクトには、カタログ アイテムのすべてのデータが含まれているわけではありません。 ページの items 配列内のアイテムの順序は定義されません。 アイテムは、commitTimeStamp プロパティを使用してメモリ内でクライアントにより並べ替えできます。

ページ内のカタログ アイテムの数は、サーバーの実装によって定義されます。 nuget.org の場合、各ページには最大 550 個のアイテムがあります。しかし、いくつかのページでは、その時点での次のコミット バッチのサイズに応じて実際の数が小さくなる場合があります。

新しいアイテムが導入されると、count はインクリメントされ、items 配列に新しいカタログ アイテムが表示されます。

アイテムがページに追加されると、commitId が変更され commitTimeStamp が増加します。 これら 2 つのプロパティは、基本的に items 配列内のすべての commitId および commitTimeStamp 値の概要です。

ページ内のカタログ アイテム オブジェクト

カタログ ページ の items プロパティに含まれるカタログ アイテム オブジェクトには、次のプロパティがあります。

名前 タイプ 必須 メモ
@id string はい カタログ アイテムをフェッチする URL
@type string はい カタログ アイテムの種類
commitId string はい このカタログ アイテムに関連付けられているコミット ID
commitTimeStamp string はい このカタログ アイテムのコミット タイムスタンプ
nuget:id string はい このリーフが関連付けられているパッケージ ID
nuget:version string はい このリーフが関連付けられているパッケージ バージョン

@type 値は次の 2 つの値のいずれかになります。

  1. nuget:PackageDetails: カタログ リーフ ドキュメントの PackageDetails タイプに対応します。
  2. nuget:PackageDelete: カタログ リーフ ドキュメントの PackageDelete タイプに対応します。

各種類の意味についての詳細は、下記の対応するアイテムの種類を参照してください。

要求のサンプル

GET https://api.nuget.org/v3/catalog0/page2926.json

応答のサンプル

{
  "commitId": "616117f5-d9dd-4664-82b9-74d87169bbe9",
  "commitTimeStamp": "2017-10-31T23:30:32.4197849Z",
  "count": 5,
  "parent": "https://api.nuget.org/v3/catalog0/index.json",
  "items": [
    {
      "@id": "https://api.nuget.org/v3/catalog0/data/2017.10.31.23.30.32/util.biz.payments.0.0.4-preview.json",
      "@type": "nuget:PackageDetails",
      "commitId": "616117f5-d9dd-4664-82b9-74d87169bbe9",
      "commitTimeStamp": "2017-10-31T23:30:32.4197849Z",
      "nuget:id": "Util.Biz.Payments",
      "nuget:version": "0.0.4-preview"
    },
    {
      "@id": "https://api.nuget.org/v3/catalog0/data/2017.10.31.23.28.02/util.biz.0.0.4-preview.json",
      "@type": "nuget:PackageDetails",
      "commitId": "820340b2-97e3-4f93-b82e-bc85550a6560",
      "commitTimeStamp": "2017-10-31T23:28:02.788239Z",
      "nuget:id": "Util.Biz",
      "nuget:version": "0.0.4-preview"
    },
    {
      "@id": "https://api.nuget.org/v3/catalog0/data/2017.10.31.22.31.22/sourcecode.clay.data.1.0.0-preview1-00258.json",
      "@type": "nuget:PackageDetails",
      "commitId": "cae34527-ffc7-4e96-884f-7cf95a32dbdd",
      "commitTimeStamp": "2017-10-31T22:31:22.5169519Z",
      "nuget:id": "SourceCode.Clay.Data",
      "nuget:version": "1.0.0-preview1-00258"
    },
    {
      "@id": "https://api.nuget.org/v3/catalog0/data/2017.10.31.22.31.22/sourcecode.clay.1.0.0-preview1-00258.json",
      "@type": "nuget:PackageDetails",
      "commitId": "cae34527-ffc7-4e96-884f-7cf95a32dbdd",
      "commitTimeStamp": "2017-10-31T22:31:22.5169519Z",
      "nuget:id": "SourceCode.Clay",
      "nuget:version": "1.0.0-preview1-00258"
    },
    {
      "@id": "https://api.nuget.org/v3/catalog0/data/2017.10.31.22.31.22/sourcecode.clay.json.1.0.0-preview1-00258.json",
      "@type": "nuget:PackageDetails",
      "commitId": "cae34527-ffc7-4e96-884f-7cf95a32dbdd",
      "commitTimeStamp": "2017-10-31T22:31:22.5169519Z",
      "nuget:id": "SourceCode.Clay.Json",
      "nuget:version": "1.0.0-preview1-00258"
    }
  ]
}

カタログ リーフ

カタログ リーフには、特定の時点での特定のパッケージ ID およびバージョンに関するメタデータが含まれています。 これは、カタログ ページにある @id 値を使用してフェッチされるドキュメントです。 カタログ リーフへの URL は予測可能なものではなく、カタログ ページのみを使用して検出する必要があります。

カタログ リーフ ドキュメントは、次のプロパティを持つ JSON オブジェクトです。

名前 タイプ 必須 メモ
@type 文字列または文字列の配列 はい カタログ アイテムの種類
catalog:commitId string はい このカタログ アイテムに関連付けられているコミット ID
catalog:commitTimeStamp string はい このカタログ アイテムのコミット タイムスタンプ
ID string はい カタログ アイテムのパッケージ ID
published string はい パッケージ カタログ アイテムの公開日
version string はい カタログ アイテムのパッケージ バージョン

アイテムの種類

@type プロパティは文字列、または文字列の配列です。 便宜上、@type 値が文字列の場合は、サイズ 1 の任意の配列として扱う必要があります。 @type で使用可能なすべての値が文書化されているわけではありません。 ただし、各カタログ アイテムには、次の 2 種類の文字列の値のうち必ず 1 つが存在します。

  1. PackageDetails: パッケージ メタデータのスナップショットを表します
  2. PackageDelete: 削除されたパッケージを表します

パッケージの詳細カタログ アイテム

タイプ PackageDetails のカタログ アイテムには、特定のパッケージのパッケージ メタデータのスナップショット (ID とバージョンの組み合わせ) が含まれています。 パッケージの詳細カタログ アイテムは、パッケージ ソースで次のいずれかのシナリオが発生した際に生成されます。

  1. パッケージがプッシュされた
  2. パッケージが再リストされた
  3. パッケージがリスト解除された
  4. パッケージが 非推奨になった
  5. パッケージが 非推奨ではなくなった
  6. パッケージが リフローされた
  7. パッケージの脆弱性の状態が更新された。

パッケージ リフローは、基本的に既存のパッケージにおける偽のプッシュを生成し、パッケージ自体は変更しない管理ジェスチャーです。 nuget.org では、カタログを使用するバックグラウンド ジョブにおけるいずれかのバグを修正した後、リフローが使用されます。

カタログ アイテムを使用するクライアントでは、カタログ アイテムが生成されるシナリオを特定しようとしないでください。 代わりに、保持するビューまたはインデックスをカタログ アイテムに含まれるメタデータで更新する必要があります。 さらに、重複するカタログ アイテムは、適切に処理 (べき等) する必要があります。

パッケージの詳細カタログ アイテムには、すべてのカタログ リーフに含まれるプロパティに加え、次のプロパティがあります。

名前 タイプ 必須 メモ
authors string いいえ
作成済 string いいえ パッケージが最初に作成された日時のタイムスタンプ。 フォールバック プロパティ: published
dependencyGroups オブジェクトの配列 いいえ ターゲット フレームワーク別にグループ化されたパッケージの依存関係 (パッケージ メタデータ リソースと同じ形式)
非推奨 object いいえ パッケージに関連付けられている非推奨 (パッケージ メタデータ リソースと同じ形式)
description string いいえ
iconUrl string いいえ
isPrerelease boolean いいえ パッケージ バージョンがプレリリースかどうか。 version から検出できます。
言語 string いいえ
licenseUrl string いいえ
一覧 boolean いいえ パッケージがリストされているかどうか
minClientVersion string いいえ
packageHash string はい パッケージのハッシュ (標準ベース 64 を使用したエンコード)
packageHashAlgorithm string はい
packageSize integer はい パッケージ .nupkg のサイズ (バイト単位)。
packageTypes オブジェクトの配列 いいえ 作成者によって指定されたパッケージの種類。
projectUrl string いいえ
releaseNotes string いいえ
requireLicenseAgreement boolean いいえ 除外する場合 false を想定
まとめ string いいえ
tags 文字列の配列 いいえ
title string いいえ
verbatimVersion string いいえ .nuspec にもともと含まれていたバージョン文字列
vulnerabilities オブジェクトの配列 いいえ パッケージのセキュリティ脆弱性

パッケージの version プロパティは、正規化後の完全なバージョン文字列です。 つまり、SemVer 2.0.0 ビルド データをここに含めることができます。

created タイムスタンプは、パッケージがパッケージ ソースにより最初に受信された日時です。これは通常、カタログ アイテムのコミット タイムスタンプの前の短い時間です。

packageHashAlgorithm は、サーバー実装によって定義される文字列で、packageHash の生成に使用されるハッシュ アルゴリズムを表します。 nuget.org は、常に SHA512packageHashAlgorithm 値を使用します。

この packageTypes プロパティは、パッケージの種類が作成者によって指定された場合にのみ存在します。 これが存在する場合、常に少なくとも 1 つの (1) エントリが含まれます。 packageTypes 配列の各アイテムは、次のプロパティを持つ JSON オブジェクトです。

名前 タイプ 必須 メモ
name string はい パッケージの種類の名前です。
version string いいえ パッケージの種類のバージョンです。 作成者が nuspec でバージョンを明示的に指定した場合にのみ存在します。

published タイムスタンプは、パッケージが最後にリストされた時間です。

Note

nuget.org では、パッケージがリスト解除されている場合、published 値は 1900 年に設定されます。

脆弱性

vulnerability オブジェクトの配列。 各脆弱性には以下のプロパティがあります。

名前 タイプ 必須 メモ
advisoryUrl string はい パッケージのセキュリティ アドバイザリの場所
severity string はい アドバイザリの重大度: "0" = Low (低)、"1" = Moderate (中)、"2" = High (高)、"3" = Critical (重大)

severity プロパティにここに記載されている値以外が含まれている場合、アドバイザリの重大度は Low (低) として扱われます。

要求のサンプル

GET https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json

応答のサンプル

{
  "@type": [
    "PackageDetails",
    "catalog:Permalink"
  ],
  "authors": "NuGet.org Team",
  "catalog:commitId": "49fe04d8-5694-45a5-9822-3be61bda871b",
  "catalog:commitTimeStamp": "2015-02-01T11:18:40.8589193Z",
  "created": "2011-12-02T20:21:23.74Z",
  "description": "This package is an example for the V3 protocol.",
  "deprecation": {
    "reasons": [
      "Legacy",
      "HasCriticalBugs",
      "Other"
    ],
    "message": "This package is an example--it should not be used!",
    "alternatePackage": {
      "id": "Newtonsoft.JSON",
      "range": "12.0.2"
    }
  },
  "iconUrl": "https://www.nuget.org/Content/gallery/img/default-package-icon.svg",
  "id": "NuGet.Protocol.V3.Example",
  "isPrerelease": false,
  "language": "en-US",
  "licenseUrl": "http://www.opensource.org/licenses/ms-pl",
  "packageHash": "2edCwKLcbcgFJpsAwa883BLtOy8bZpWwbQpiIb71E74k5t2f2WzXEGWbPwntRleUEgSrcxJrh9Orm/TAmgO4NQ==",
  "packageHashAlgorithm": "SHA512",
  "packageSize": 118348,
  "packageTypes": [
    {
      "@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json#packagetypes/DotnetTool",
      "@type": "PackageType",
      "name": "DotnetTool"
    }
  ],
  "projectUrl": "https://github.com/NuGet/NuGetGallery",
  "published": "1900-01-01T00:00:00Z",
  "requireLicenseAcceptance": false,
  "title": "NuGet V3 Protocol Example",
  "version": "1.0.0",
  "dependencyGroups": [
    {
      "@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json#dependencygroup",
      "@type": "PackageDependencyGroup",
      "dependencies": [
        {
          "@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json#dependencygroup/aspnet.suppressformsredirect",
          "@type": "PackageDependency",
          "id": "aspnet.suppressformsredirect",
          "range": "[0.0.1.4, )"
        },
        {
          "@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json#dependencygroup/webactivator",
          "@type": "PackageDependency",
          "id": "WebActivator",
          "range": "[1.4.4, )"
        },
        {
          "@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json#dependencygroup/webapi.all",
          "@type": "PackageDependency",
          "id": "WebApi.All",
          "range": "[0.5.0, )"
        }
      ],
      "targetFramework": ".NETFramework4.6"
    }
  ],
  "tags": [
    "NuGet",
    "V3",
    "Protocol",
    "Example"
  ],
  "vulnerabilities": [
    {
      "@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json#vulnerability/GitHub/999",
      "@type": "Vulnerability",
      "advisoryUrl": "https://github.com/advisories/ABCD-1234-5678-9012",
      "severity": "2"
    }
  ]
}

パッケージの削除カタログ アイテム

タイプ PackageDelete のカタログ アイテムには、パッケージがパッケージ ソースから削除され、パッケージ操作 (復元など) に使用できなくなったことをカタログ クライアントに示す最小限の情報セットが含まれます。

Note

パッケージを削除し、同じパッケージ ID およびバージョンを使用して後で再発行できます。 パッケージ ID およびバージョンが特定のパッケージ コンテンツを示すという公式のクライアントの前提に反するため、これは nuget.org で非常にまれなケースです。 nuget.org でのパッケージの削除についての詳細は、ポリシーを参照してください。

パッケージの削除カタログ アイテムには、すべてのカタログ リーフに含まれるプロパティの他に、追加のプロパティはありません。

version プロパティは、パッケージ .nuspec に含まれる元のバージョンの文字列です。

published プロパティは、パッケージが削除された時間です。これは通常、カタログ アイテムのコミット タイムスタンプの前の短い時間です。

要求のサンプル

GET https://api.nuget.org/v3/catalog0/data/2017.11.02.00.40.00/netstandard1.4_lib.1.0.0-test.json

応答のサンプル

{
  "@type": [
    "PackageDelete",
    "catalog:Permalink"
  ],
  "catalog:commitId": "19fec5b4-9335-4e4b-bd50-8d5d3f734597",
  "catalog:commitTimeStamp": "2017-11-02T00:40:00.1969812Z",
  "id": "netstandard1.4_lib",
  "originalId": "netstandard1.4_lib",
  "published": "2017-11-02T00:37:43.7181952Z",
  "version": "1.0.0-test"
}

Cursor

概要

このセクションでは、クライアントの概念について説明します。プロトコルは必ずしも必須ではありませんが、実際のカタログ クライアント実装の一部である必要があります。

カタログは、時間でインデックスが作成された追加専用のデータ構造であるため、クライアントはカーソルをローカルに格納する必要があります。これは、クライアントがカタログ アイテムを処理した時点までを表します。 このカーソル値は、クライアントのマシン クロックを使用して生成してはいけません。 代わりに、値はカタログ オブジェクトの commitTimestamp 値から取得する必要があります。

クライアントは、パッケージ ソースで新しいイベントを処理する際はいつでも、格納されているカーソルより大きいコミット タイムスタンプを持つすべてのカタログ アイテムのカタログにのみクエリを実行する必要があります。 クライアントは、すべての新しいカタログ アイテムを正常に処理した後、新しいカーソル値として処理されたカタログ アイテムの最新のコミット タイムスタンプを記録します。

この方法を使用すると、パッケージ ソースで発生したパッケージ イベントをクライアントが見逃すことはありません。 またクライアントは、カーソルの記録されたコミット タイムスタンプ以前の古いイベントを再処理する必要はありません。

このカーソルの強力な概念は、nuget.org バックグラウンド ジョブの多くで使用され、V3 API 自体を最新の状態に保つために使用されます。

初期値

カタログ クライアントが初めて起動する場合 (したがってカーソル値がない場合)、NET の System.DateTimeOffset.MinValue の既定のカーソル値、または最小の表現可能なタイムスタンプのそのような類似の概念を使用する必要があります。

反復処理カタログ アイテム

処理するカタログ アイテムの次のセットをクエリするには、クライアントで次の手順を実行する必要があります。

  1. ローカル ストアから記録されたカーソル値をフェッチします。
  2. カタログ インデックスをダウンロードして逆シリアル化します。
  3. コミット タイムスタンプがカーソルより大きいカタログ ページをすべて検索します。
  4. 処理するカタログ アイテムの空のリストを宣言します。
  5. 手順 3 で一致したカタログ ページごとに、次の操作を行います。
    1. カタログ ページをダウンロードして逆シリアル化します。
    2. コミット タイムスタンプがカーソルより大きいカタログ アイテムをすべて検索します。
    3. 手順 4 で宣言したリストに、一致するすべてのカタログ アイテムを追加します。
  6. カタログ アイテムのリストをコミット タイムスタンプで並べ替えます。
  7. 各カタログ アイテムを順番に処理します。
    1. カタログ アイテムをダウンロードして逆シリアル化します。
    2. カタログ アイテムの種類に適切に対応します。
    3. カタログ アイテムのドキュメントをクライアント固有の方法で処理します。
  8. 最後のカタログ アイテムのコミット タイムスタンプを新しいカーソル値として記録します。

この基本的なアルゴリズムを使用すると、クライアント実装ではパッケージ ソースで使用可能なすべてのパッケージの完全なビューを構築できます。 パッケージ ソースに対する最新の変更を常に認識するため、クライアントではこのアルゴリズムを定期的に実行する必要があります。

Note

これは、パッケージ メタデータパッケージ コンテンツ検索オートコンプリートのリソースを最新の状態に保つために nuget.org で使用されるアルゴリズムです。

依存カーソル

あるクライアントの出力が別のクライアントの出力に依存する、固有の依存関係を持つ 2 つのカタログ クライアントがあるとします。

たとえば、nuget.org では新しく発行されたパッケージがパッケージ メタデータ リソースに表示される前に、検索リソースに表示されないようにする必要があります。 これは、公式の NuGet クライアントによって実行される「復元」操作でパッケージ メタデータ リソースが使用されるためです。 顧客が検索サービスを使用してパッケージを検出した場合、パッケージ メタデータ リソースを使用してそのパッケージを正常に復元できる必要があります。 つまり、検索リソースはパッケージ メタデータ リソースに依存します。 各リソースには、そのリソースを更新するカタログ クライアントのバックグラウンド ジョブがあります。 各クライアントには独自のカーソルがあります。

両方のリソースがカタログからビルドされるため、検索リソースを更新するカタログ クライアントのカーソルは、パッケージ メタデータのカタログ クライアントのカーソルを超えてはいけません

アルゴリズム

この制限を実装するには、上記のアルゴリズムを次のように変更します。

  1. ローカル ストアから記録されたカーソル値をフェッチします。
  2. カタログ インデックスをダウンロードして逆シリアル化します。
  3. コミット タイムスタンプが、依存関係のカーソル以下のカーソルより大きいカタログ ページをすべて検索します。
  4. 処理するカタログ アイテムの空のリストを宣言します。
  5. 手順 3 で一致したカタログ ページごとに、次の操作を行います。
    1. カタログ ページをダウンロードして逆シリアル化します。
    2. コミット タイムスタンプが、依存関係のカーソル以下のカーソルより大きいカタログ アイテムをすべて検索します。
    3. 手順 4 で宣言したリストに、一致するすべてのカタログ アイテムを追加します。
  6. カタログ アイテムのリストをコミット タイムスタンプで並べ替えます。
  7. 各カタログ アイテムを順番に処理します。
    1. カタログ アイテムをダウンロードして逆シリアル化します。
    2. カタログ アイテムの種類に適切に対応します。
    3. カタログ アイテムのドキュメントをクライアント固有の方法で処理します。
  8. 最後のカタログ アイテムのコミット タイムスタンプを新しいカーソル値として記録します。

この変更されたアルゴリズムを使用すると、依存カタログ クライアントのシステムを構築して、独自に特定のインデックスや成果物などをすべて生成できます。