Catalog
カタログは、作成や削除など、パッケージ ソースに対するすべてのパッケージ操作を記録するリソースです。 サービス インデックスでのカタログ リソースの種類は Catalog
です。 このリソースを使用して、発行されたすべてのパッケージに対してクエリを実行できます。
注意
カタログは公式の NuGet クライアントでは使用されないため、すべてのパッケージ ソースがカタログを実装しているわけではありません。
注意
現時点では、中国で nuget.org カタログを使用することはできません。 詳細については「NuGet/NuGetGallery#4949」を参照してください。
次の @type
値が使用されます。
@type 値 | メモ |
---|---|
Catalog/3.0.0 | 初期リリース |
次の API のエントリ ポイント URL は、前述のリソースの @type
値に関連付けられている @id
プロパティの値です。 このトピックでは、プレースホルダー URL {@id}
を使用します。
カタログ リソースにあるすべての URL は、HTTP メソッド GET
および HEAD
のみをサポートしています。
カタログ インデックスは、カタログ アイテムのリストが時系列に並べられた既知の場所にあるドキュメントです。 これは、カタログ リソースのエントリ ポイントです。
インデックスはカタログ ページで構成されます。 各カタログ ページにはカタログ アイテムが含まれています。 各カタログ アイテムは、特定の時点での 1 つのパッケージに関するイベントを表します。 カタログ アイテムでは、作成、リスト解除、再リスト、またはパッケージ ソースから削除されたパッケージを表すことができます。 カタログ アイテムを時系列順に処理することで、クライアントは V3 パッケージ ソースに存在するすべてのパッケージの最新のビューを作成できます。
手短に言うと、カタログ BLOB には次の階層構造があります。
- インデックス: カタログのエントリ ポイント。
- ページ: カタログ アイテムのグループ。
- リーフ: 1 つのパッケージの状態のスナップショットである、カタログ アイテムを表すドキュメント。
各カタログ オブジェクトには、アイテムがカタログに追加された日時を表す commitTimeStamp
と呼ばれるプロパティが含まれます。 カタログ アイテムは、コミットと呼ばれるバッチでカタログ ページに追加されます。 同じコミット内のすべてのカタログ アイテムには、同じコミット タイムスタンプ (commitTimeStamp
) および コミット ID (commitId
) があります。 同じコミットに配置されたカタログ アイテムは、パッケージ ソースで同じ時点に発生したイベントを表します。 カタログのコミット内に順序はありません。
各パッケージ ID とバージョンは一意であるため、1 つのコミットに複数のカタログ アイテムが存在することはありません。 これにより、コミット タイムスタンプに基づき、1 つのパッケージのカタログ アイテムを常に明確に並べ替えできます。
1 つの commitTimeStamp
カタログに対して複数のコミットが存在することはありません。 言い換えると、commitId
は commitTimeStamp
と重複します。
パッケージ 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 つの値のいずれかになります。
nuget:PackageDetails
: カタログ リーフ ドキュメントのPackageDetails
タイプに対応します。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 つが存在します。
PackageDetails
: パッケージ メタデータのスナップショットを表しますPackageDelete
: 削除されたパッケージを表します
タイプ PackageDetails
のカタログ アイテムには、特定のパッケージのパッケージ メタデータのスナップショット (ID とバージョンの組み合わせ) が含まれています。 パッケージの詳細カタログ アイテムは、パッケージ ソースで次のいずれかのシナリオが発生した際に生成されます。
- パッケージがプッシュされた。
- パッケージが再リストされた。
- パッケージがリスト解除された。
- パッケージが 非推奨になった。
- パッケージが 非推奨ではなくなった。
- パッケージが リフローされた。
- パッケージの脆弱性の状態が更新された。
パッケージ リフローは、基本的に既存のパッケージにおける偽のプッシュを生成し、パッケージ自体は変更しない管理ジェスチャーです。 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 は、常に SHA512
の packageHashAlgorithm
値を使用します。
この packageTypes
プロパティは、パッケージの種類が作成者によって指定された場合にのみ存在します。 これが存在する場合、常に少なくとも 1 つの (1) エントリが含まれます。 packageTypes
配列の各アイテムは、次のプロパティを持つ JSON オブジェクトです。
名前 | タイプ | 必須 | メモ |
---|---|---|---|
name | string | はい | パッケージの種類の名前です。 |
version | string | いいえ | パッケージの種類のバージョンです。 作成者が nuspec でバージョンを明示的に指定した場合にのみ存在します。 |
published
タイムスタンプは、パッケージが最後にリストされた時間です。
注意
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
のカタログ アイテムには、パッケージがパッケージ ソースから削除され、パッケージ操作 (復元など) に使用できなくなったことをカタログ クライアントに示す最小限の情報セットが含まれます。
注意
パッケージを削除し、同じパッケージ 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"
}
このセクションでは、クライアントの概念について説明します。プロトコルは必ずしも必須ではありませんが、実際のカタログ クライアント実装の一部である必要があります。
カタログは、時間でインデックスが作成された追加専用のデータ構造であるため、クライアントはカーソルをローカルに格納する必要があります。これは、クライアントがカタログ アイテムを処理した時点までを表します。 このカーソル値は、クライアントのマシン クロックを使用して生成してはいけません。 代わりに、値はカタログ オブジェクトの commitTimestamp
値から取得する必要があります。
クライアントは、パッケージ ソースで新しいイベントを処理する際はいつでも、格納されているカーソルより大きいコミット タイムスタンプを持つすべてのカタログ アイテムのカタログにのみクエリを実行する必要があります。 クライアントは、すべての新しいカタログ アイテムを正常に処理した後、新しいカーソル値として処理されたカタログ アイテムの最新のコミット タイムスタンプを記録します。
この方法を使用すると、パッケージ ソースで発生したパッケージ イベントをクライアントが見逃すことはありません。 またクライアントは、カーソルの記録されたコミット タイムスタンプ以前の古いイベントを再処理する必要はありません。
このカーソルの強力な概念は、nuget.org バックグラウンド ジョブの多くで使用され、V3 API 自体を最新の状態に保つために使用されます。
カタログ クライアントが初めて起動する場合 (したがってカーソル値がない場合)、NET の System.DateTimeOffset.MinValue
の既定のカーソル値、または最小の表現可能なタイムスタンプのそのような類似の概念を使用する必要があります。
処理するカタログ アイテムの次のセットをクエリするには、クライアントで次の手順を実行する必要があります。
- ローカル ストアから記録されたカーソル値をフェッチします。
- カタログ インデックスをダウンロードして逆シリアル化します。
- コミット タイムスタンプがカーソルより大きいカタログ ページをすべて検索します。
- 処理するカタログ アイテムの空のリストを宣言します。
- 手順 3 で一致したカタログ ページごとに、次の操作を行います。
- カタログ ページをダウンロードして逆シリアル化します。
- コミット タイムスタンプがカーソルより大きいカタログ アイテムをすべて検索します。
- 手順 4 で宣言したリストに、一致するすべてのカタログ アイテムを追加します。
- カタログ アイテムのリストをコミット タイムスタンプで並べ替えます。
- 各カタログ アイテムを順番に処理します。
- カタログ アイテムをダウンロードして逆シリアル化します。
- カタログ アイテムの種類に適切に対応します。
- カタログ アイテムのドキュメントをクライアント固有の方法で処理します。
- 最後のカタログ アイテムのコミット タイムスタンプを新しいカーソル値として記録します。
この基本的なアルゴリズムを使用すると、クライアント実装ではパッケージ ソースで使用可能なすべてのパッケージの完全なビューを構築できます。 パッケージ ソースに対する最新の変更を常に認識するため、クライアントではこのアルゴリズムを定期的に実行する必要があります。
注意
これは、パッケージ メタデータ、パッケージ コンテンツ、検索、オートコンプリートのリソースを最新の状態に保つために nuget.org で使用されるアルゴリズムです。
あるクライアントの出力が別のクライアントの出力に依存する、固有の依存関係を持つ 2 つのカタログ クライアントがあるとします。
たとえば、nuget.org では新しく発行されたパッケージがパッケージ メタデータ リソースに表示される前に、検索リソースに表示されないようにする必要があります。 これは、公式の NuGet クライアントによって実行される「復元」操作でパッケージ メタデータ リソースが使用されるためです。 顧客が検索サービスを使用してパッケージを検出した場合、パッケージ メタデータ リソースを使用してそのパッケージを正常に復元できる必要があります。 つまり、検索リソースはパッケージ メタデータ リソースに依存します。 各リソースには、そのリソースを更新するカタログ クライアントのバックグラウンド ジョブがあります。 各クライアントには独自のカーソルがあります。
両方のリソースがカタログからビルドされるため、検索リソースを更新するカタログ クライアントのカーソルは、パッケージ メタデータのカタログ クライアントのカーソルを超えてはいけません。
この制限を実装するには、上記のアルゴリズムを次のように変更します。
- ローカル ストアから記録されたカーソル値をフェッチします。
- カタログ インデックスをダウンロードして逆シリアル化します。
- コミット タイムスタンプが、依存関係のカーソル以下のカーソルより大きいカタログ ページをすべて検索します。
- 処理するカタログ アイテムの空のリストを宣言します。
- 手順 3 で一致したカタログ ページごとに、次の操作を行います。
- カタログ ページをダウンロードして逆シリアル化します。
- コミット タイムスタンプが、依存関係のカーソル以下のカーソルより大きいカタログ アイテムをすべて検索します。
- 手順 4 で宣言したリストに、一致するすべてのカタログ アイテムを追加します。
- カタログ アイテムのリストをコミット タイムスタンプで並べ替えます。
- 各カタログ アイテムを順番に処理します。
- カタログ アイテムをダウンロードして逆シリアル化します。
- カタログ アイテムの種類に適切に対応します。
- カタログ アイテムのドキュメントをクライアント固有の方法で処理します。
- 最後のカタログ アイテムのコミット タイムスタンプを新しいカーソル値として記録します。
この変更されたアルゴリズムを使用すると、依存カタログ クライアントのシステムを構築して、独自に特定のインデックスや成果物などをすべて生成できます。