Katalog
Katalog je prostředek, který zaznamenává všechny operace balíčků ve zdroji balíčku, například vytváření a odstraňování. Prostředek katalogu má Catalog
typ v indexu služby. Tento prostředek můžete použít k dotazování na všechny publikované balíčky.
Poznámka
Vzhledem k tomu, že katalog není používán oficiálním klientem NuGet, ne všechny zdroje balíčků implementují katalog.
Poznámka
V současné době není katalog nuget.org k dispozici v Číně. Další podrobnosti najdete v tématu NuGet/NuGetGallery#4949.
Použije se následující @type
hodnota:
@type Hodnotu | Notes |
---|---|
Katalog/3.0.0 | Počáteční verze |
Adresa URL vstupního @id
bodu pro následující rozhraní API je hodnota vlastnosti přidružené k výše uvedeným hodnotám prostředků @type
. Toto téma používá zástupnou adresu URL {@id}
.
Všechny adresy URL nalezené v prostředku katalogu podporují pouze metody GET
HTTP a HEAD
.
Index katalogu je dokument ve známém umístění se seznamem položek katalogu seřazených chronologicky. Jedná se o vstupní bod prostředku katalogu.
Index se skládá ze stránek katalogu. Každá stránka katalogu obsahuje položky katalogu. Každá položka katalogu představuje událost týkající se jednoho balíčku v okamžiku v čase. Položka katalogu může představovat balíček, který byl vytvořen, neveřejně zařazen, relistován nebo odstraněn ze zdroje balíčku. Díky zpracování položek katalogu v chronologickém pořadí může klient vytvořit aktuální zobrazení všech balíčků, které existují ve zdroji balíčku V3.
Objekty blob katalogu mají stručně následující hierarchickou strukturu:
- Index: vstupní bod katalogu.
- Stránka: seskupení položek katalogu.
- List: dokument představující položku katalogu, což je snímek stavu jednoho balíčku.
Každý objekt katalogu má vlastnost, která se nazývá commitTimeStamp
reprezentace při přidání položky do katalogu. Položky katalogu se přidají na stránku katalogu v dávkách označovaných jako potvrzení. Všechny položky katalogu ve stejném potvrzení mají stejné časové razítko potvrzení (commitTimeStamp
) a ID potvrzení (commitId
). Položky katalogu umístěné ve stejném potvrzení představují události, ke kterým došlo přibližně ke stejnému bodu v čase ve zdroji balíčku. V potvrzení katalogu není žádné řazení.
Vzhledem k tomu, že každé ID balíčku a verze jsou jedinečné, nebude v potvrzení nikdy více než jedna položka katalogu. Tím zajistíte, že položky katalogu pro jeden balíček lze vždy jednoznačně uspořádat s ohledem na časové razítko potvrzení.
V katalogu nikdy není více než jedno potvrzení na každý commitTimeStamp
. Jinými slovy, je commitId
redundantní s commitTimeStamp
.
Na rozdíl od prostředku metadat balíčku, který je indexován podle ID balíčku, je katalog indexován (a dotazovatelný) pouze časově.
Položky katalogu se vždy přidávají do katalogu v monotonicky rostoucím chronologickém pořadí. To znamená, že pokud je potvrzení katalogu přidáno v čase X, nebude přidáno žádné potvrzení katalogu s časem kratším nebo rovno X.
Následující požadavek načte index katalogu.
GET {@id}
Index katalogu je dokument JSON, který obsahuje objekt s následujícími vlastnostmi:
Name | Type | Požaduje se | Notes |
---|---|---|---|
commitId | string | ano | Jedinečné ID přidružené k nejnovějšímu potvrzení |
commitTimeStamp | string | ano | Časové razítko posledního potvrzení |
count | integer | ano | Počet stránek v indexu |
položky | pole objektů | ano | Pole objektů, každý objekt představující stránku |
Každý prvek v items
poli je objekt s několika minimálními podrobnostmi o každé stránce. Tyto objekty stránky neobsahují listy katalogu (položky). Pořadí prvků v tomto poli není definováno. Stránky může klient uspořádat v paměti pomocí své commitTimeStamp
vlastnosti.
Při zavádění count
nových stránek se zvýší a v items
poli se zobrazí nové objekty.
Při přidávání položek do katalogu se index commitId
změní a zvýší se commitTimeStamp
. Tyto dvě vlastnosti jsou v podstatě souhrnem všech stránek commitId
a commitTimeStamp
hodnot v items
poli.
Objekty stránky katalogu nalezené ve vlastnosti indexu items
katalogu mají následující vlastnosti:
Name | Type | Požaduje se | Notes |
---|---|---|---|
@id | string | ano | Adresa URL pro načtení stránky katalogu |
commitId | string | ano | Jedinečné ID přidružené k nejnovějšímu potvrzení na této stránce |
commitTimeStamp | string | ano | Časové razítko posledního potvrzení na této stránce |
count | integer | ano | Počet položek na stránce katalogu |
Na rozdíl od prostředku metadat balíčku, který v některých případech vložené listy do indexu, listy katalogu nejsou nikdy vloženy do indexu a musí být vždy načteny pomocí adresy URL stránky @id
.
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
}
]
}
Stránka katalogu je kolekce položek katalogu. Jedná se o dokument načtený pomocí jedné z @id
hodnot nalezených v indexu katalogu. Adresa URL stránky katalogu není určená k předvídatelnosti a měla by být zjištěna pouze pomocí indexu katalogu.
Nové položky katalogu se přidají na stránku v indexu katalogu pouze s nejvyšším časovým razítkem potvrzení nebo na novou stránku. Po přidání stránky s vyšším časovým razítkem potvrzení do katalogu se starší stránky nikdy nepřidají ani nezmění.
Dokument stránky katalogu je objekt JSON s následujícími vlastnostmi:
Name | Type | Požaduje se | Notes |
---|---|---|---|
commitId | string | ano | Jedinečné ID přidružené k nejnovějšímu potvrzení na této stránce |
commitTimeStamp | string | ano | Časové razítko posledního potvrzení na této stránce |
count | integer | ano | Počet položek na stránce |
položky | pole objektů | ano | Položky katalogu na této stránce |
parent | string | ano | Adresa URL indexu katalogu |
Každý prvek v items
poli je objekt s několika minimálními podrobnostmi o položce katalogu. Tyto objekty položek neobsahují všechna data položky katalogu. Pořadí položek v poli stránky items
není definováno. Položky mohou být objednány klientem v paměti pomocí jejich commitTimeStamp
vlastnosti.
Počet položek katalogu na stránce je definován implementací serveru. U nuget.org je na každé stránce nejvýše 550 položek, i když skutečné číslo může být pro některé stránky menší v závislosti na velikosti další dávky potvrzení v okamžiku v čase.
Při zavádění count
nových položek se zvýší a v poli se zobrazí items
nové objekty položek katalogu.
Když se položky přidají na stránku, změní se commitId
a zvýší se commitTimeStamp
. Tyto dvě vlastnosti jsou v podstatě souhrnem všech commitId
hodnot v commitTimeStamp
items
poli.
Objekty položek katalogu nalezené ve vlastnosti stránky items
katalogu mají následující vlastnosti:
Name | Type | Požaduje se | Notes |
---|---|---|---|
@id | string | ano | Adresa URL pro načtení položky katalogu |
@type | string | ano | Typ položky katalogu |
commitId | string | ano | ID potvrzení přidružené k této položce katalogu |
commitTimeStamp | string | ano | Časové razítko potvrzení této položky katalogu |
nuget:id | string | ano | ID balíčku, se kterým tento list souvisí |
nuget:version | string | ano | Verze balíčku, se kterou tento list souvisí |
Hodnota @type
bude jedna z následujících dvou hodnot:
nuget:PackageDetails
: OdpovídáPackageDetails
typu v dokumentu typu list katalogu.nuget:PackageDelete
: OdpovídáPackageDelete
typu v dokumentu typu list katalogu.
Další podrobnosti o tom, co jednotlivé typy znamenají, najdete v následujícím typu odpovídajících položek.
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"
}
]
}
List katalogu obsahuje metadata o konkrétním ID a verzi balíčku v určitém okamžiku. Jedná se o dokument načtený pomocí @id
hodnoty nalezené na stránce katalogu. Adresa URL listu katalogu není určená k předvídatelnosti a měla by být zjištěna pouze pomocí stránky katalogu.
Dokument typu list katalogu je objekt JSON s následujícími vlastnostmi:
Name | Type | Požaduje se | Notes |
---|---|---|---|
@type | řetězec nebo pole řetězců | ano | Typy položek katalogu |
catalog:commitId | string | ano | ID potvrzení přidružené k této položce katalogu |
catalog:commitTimeStamp | string | ano | Časové razítko potvrzení této položky katalogu |
ID | string | ano | ID balíčku položky katalogu |
Zveřejněna | string | ano | Datum publikování položky katalogu balíčků |
version | string | ano | Verze balíčku položky katalogu |
Vlastnost @type
je řetězec nebo pole řetězců. Pro usnadnění, pokud @type
je hodnota řetězec, měla by být považována za libovolnou matici velikosti 1. Nejsou zdokumentované všechny možné hodnoty @type
. Každá položka katalogu má však přesně jednu ze dvou následujících hodnot typu řetězce:
PackageDetails
: představuje snímek metadat balíčku.PackageDelete
: představuje odstraněný balíček.
Položky katalogu s typem PackageDetails
obsahují snímek metadat balíčku pro konkrétní balíček (id a kombinaci verzí). Položka katalogu podrobností balíčku se vytvoří, když zdroj balíčku narazí na některý z následujících scénářů:
- Balíček se nasdílí.
- Balíček se znovu vyčte.
- Balíček není v seznamu.
- Balíček je zastaralý.
- Balíček je nedeprecated.
- Balíček se přeformátuje.
- Aktualizuje se stav ohrožení zabezpečení balíčku.
Přeformátování balíčku je gesto správy, které v podstatě generuje falešné nasdílení existujícího balíčku beze změn samotného balíčku. Při nuget.org se po opravě chyby v některé z úloh na pozadí, které využívají katalog, použije přeformátování.
Klienti, kteří využívají položky katalogu, by se neměli pokoušet určit, které z těchto scénářů vytvořila položku katalogu. Místo toho by klient měl jednoduše aktualizovat jakékoli udržované zobrazení nebo index s metadaty obsaženými v položce katalogu. Duplicitní nebo redundantní položky katalogu by se měly zpracovávat elegantně (idempotentní).
Položky katalogu podrobností balíčku mají kromě těch, které jsou součástí všech listů katalogu, následující vlastnosti.
Name | Type | Požaduje se | Notes |
---|---|---|---|
Autoři | string | ne | |
Vytvořen | string | ne | Časové razítko prvního vytvoření balíčku. Náhradní vlastnost: published . |
dependencyGroups | pole objektů | ne | Závislosti balíčku seskupené podle cílové architektury (stejný formát jako prostředek metadat balíčku) |
Odmítání | objekt | ne | Vyřazení přidružené k balíčku (stejný formát jako prostředek metadat balíčku) |
description | string | ne | |
iconUrl | string | ne | |
isPrerelease | boolean | ne | Bez ohledu na to, jestli je verze balíčku předběžná. Lze zjistit z version . |
jazyk | string | ne | |
licenseUrl | string | ne | |
uvedené v seznamu | boolean | ne | Zda je balíček uveden nebo není uvedený |
minClientVersion | string | ne | |
packageHash | string | ano | Hodnota hash balíčku, kódování pomocí standardního základu 64 |
packageHashAlgorithm | string | ano | |
packageSize | integer | ano | Velikost balíčku .nupkg v bajtech |
packageTypes | pole objektů | ne | Typy balíčků určené autorem. |
projectUrl | string | ne | |
releaseNotes | string | ne | |
requireLicenseAgreement | boolean | ne | Předpokládejme false , že je vyloučeno. |
Souhrn | string | ne | |
značky | pole řetězců | ne | |
title | string | ne | |
doslovná verze | string | ne | Řetězec verze, který byl původně nalezen v souboru .nuspec |
Chyby zabezpečení | pole objektů | ne | Ohrožení zabezpečení balíčku |
Vlastnost balíčku version
je řetězec úplné verze po normalizaci. To znamená, že semVer 2.0.0 může obsahovat data sestavení.
Časové created
razítko je, když byl balíček poprvé přijat zdrojem balíčku, což je obvykle krátkou dobu před časovým razítkem potvrzení položky katalogu.
Jedná se packageHashAlgorithm
o řetězec definovaný implementací serveru představující algoritmus hash použitý k vytvoření packageHash
. nuget.org vždy použil packageHashAlgorithm
hodnotu SHA512
.
Vlastnost packageTypes
bude k dispozici pouze v případě, že autor zadal typ balíčku. Pokud je k dispozici, bude mít vždy alespoň jednu (1) položku. Každá položka v packageTypes
poli je objekt JSON s následujícími vlastnostmi:
Name | Type | Požaduje se | Notes |
---|---|---|---|
name | string | ano | Název typu balíčku. |
version | string | ne | Verze typu balíčku. Existuje pouze v případě, že autor explicitně zadal verzi v nuspec. |
Časové razítko published
je čas posledního uvedení balíčku.
Poznámka
V nuget.org published
je hodnota nastavena na rok 1900, pokud balíček není v seznamu.
Pole vulnerability
objektů. Každé ohrožení zabezpečení má následující vlastnosti:
Name | Type | Požaduje se | Notes |
---|---|---|---|
advisoryUrl | string | ano | Umístění poradce pro zabezpečení balíčku |
závažnost | string | ano | Závažnost poradenství: "0" = Nízká, "1" = Střední, "2" = Vysoká, "3" = Kritická |
severity
Pokud vlastnost obsahuje jiné hodnoty, než jsou zde uvedené, je závažnost doporučení považována za Nízkou.
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"
}
]
}
Položky katalogu s typem PackageDelete
obsahují minimální sadu informací označujících klientům katalogu, že balíček byl odstraněn ze zdroje balíčku a již není k dispozici pro žádnou operaci balíčku (například obnovení).
Poznámka
Balíček je možné odstranit a později znovu publikovat pomocí stejného ID a verze balíčku. Na nuget.org je to velmi vzácný případ, protože porušuje předpoklad oficiálního klienta, že ID balíčku a verze naznačují konkrétní obsah balíčku. Další informace o odstraňování balíčků v nuget.org najdete v našich zásadách.
Kromě položek katalogu, které jsou součástí všech listů katalogu, nejsou k dispozici žádné další vlastnosti.
Vlastnost version
je původní řetězec verze nalezen v balíčku .nuspec.
Vlastnost published
je čas, kdy byl balíček odstraněn, což je obvykle krátký čas před časovým razítkem potvrzení položky katalogu.
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"
}
Tato část popisuje koncept klienta, který sice nemusí nutně znamenat, že by měl být součástí jakékoli praktické implementace klienta katalogu.
Vzhledem k tomu, že katalog je datová struktura jen pro připojení indexovaná časem, klient by měl uložit kurzor místně, který představuje až do okamžiku, kdy klient zpracoval položky katalogu. Všimněte si, že tato hodnota kurzoru by neměla být nikdy generována pomocí hodin počítače klienta. Místo toho by hodnota měla pocházet z hodnoty objektu commitTimestamp
katalogu.
Pokaždé, když klient chce zpracovat nové události ve zdroji balíčku, potřebuje dotazovat pouze katalog pro všechny položky katalogu s časovým razítkem potvrzení větší než jeho uložený kurzor. Jakmile klient úspěšně zpracuje všechny nové položky katalogu, zaznamená nejnovější časové razítko potvrzení položek katalogu, které se právě zpracuje jako nová hodnota kurzoru.
Pomocí tohoto přístupu si klient může být jist, že nikdy nezmešká žádné události balíčku, ke kterým došlo ve zdroji balíčku. Kromě toho klient nikdy nemusí znovu zpracovávat staré události před zaznamenaným časovým razítkem potvrzení kurzoru.
Tento výkonný koncept kurzorů se používá pro řadu úloh na pozadí nuget.org a slouží k udržování samotného rozhraní API V3 v aktualizovaném stavu.
Když se klient katalogu spouští poprvé (a proto nemá hodnotu kurzoru), měl by použít výchozí hodnotu kurzoru . System.DateTimeOffset.MinValue
NET nebo nějaká podobná představa minimálního reprezentovatelného časového razítka.
Pokud chcete zadat dotaz na další sadu položek katalogu ke zpracování, klient by měl:
- Načtěte zaznamenanou hodnotu kurzoru z místního úložiště.
- Stáhněte a deserializovat index katalogu.
- Vyhledá všechny stránky katalogu s časovým razítkem potvrzení větší než kurzor.
- Deklarujte prázdný seznam položek katalogu, které se mají zpracovat.
- Pro každou stránku katalogu, která odpovídá kroku 3:
- Stáhněte a deserializovali stránku katalogu.
- Vyhledejte všechny položky katalogu s časovým razítkem potvrzení větší než kurzor.
- Přidejte všechny odpovídající položky katalogu do seznamu deklarovaného v kroku 4.
- Seřaďte seznam položek katalogu podle časového razítka potvrzení.
- Zpracovat každou položku katalogu v posloupnosti:
- Stáhněte a deserializovat položku katalogu.
- Odpovídajícím způsobem reagovat na typ položky katalogu.
- Zpracovat dokument položky katalogu způsobem specifickým pro klienta.
- Poznamenejte si časové razítko potvrzení poslední položky katalogu jako novou hodnotu kurzoru.
Díky tomuto základnímu algoritmu může implementace klienta vytvořit kompletní zobrazení všech balíčků dostupných ve zdroji balíčku. Klient musí tento algoritmus spouštět jen pravidelně, aby vždy věděl o nejnovějších změnách zdroje balíčku.
Poznámka
Jedná se o algoritmus, který nuget.org používá k udržování aktuálních prostředků metadat balíčku, obsahu balíčku, vyhledávání a automatického dokončování.
Předpokládejme, že existují dva klienti katalogu, kteří mají vlastní závislost, kdy výstup jednoho klienta závisí na výstupu jiného klienta.
Například na nuget.org nově publikovaný balíček by se neměl zobrazovat ve vyhledávacím prostředku předtím, než se objeví v prostředku metadat balíčku. Důvodem je to, že operace obnovení prováděná oficiálním klientem NuGet používá prostředek metadat balíčku. Pokud zákazník zjistí balíček pomocí vyhledávací služby, měl by být schopen tento balíček úspěšně obnovit pomocí prostředku metadat balíčku. Jinými slovy, vyhledávací prostředek závisí na prostředku metadat balíčku. Každý prostředek má úlohu na pozadí klienta katalogu, která tento prostředek aktualizuje. Každý klient má svůj vlastní kurzor.
Vzhledem k tomu, že oba prostředky jsou sestaveny z katalogu, kurzor klienta katalogu, který aktualizuje vyhledávací prostředek , nesmí jít za kurzor klienta katalogu metadat balíčku.
Pokud chcete toto omezení implementovat, jednoduše upravte výše uvedený algoritmus takto:
- Načtěte zaznamenanou hodnotu kurzoru z místního úložiště.
- Stáhněte a deserializovat index katalogu.
- Vyhledá všechny stránky katalogu s časovým razítkem potvrzení, které je větší než kurzor menší nebo roven kurzoru závislosti.
- Deklarujte prázdný seznam položek katalogu, které se mají zpracovat.
- Pro každou stránku katalogu, která odpovídá kroku 3:
- Stáhněte a deserializovali stránku katalogu.
- Vyhledá všechny položky katalogu s časovým razítkem potvrzení, které je větší než kurzor menší nebo roven kurzoru závislosti.
- Přidejte všechny odpovídající položky katalogu do seznamu deklarovaného v kroku 4.
- Seřaďte seznam položek katalogu podle časového razítka potvrzení.
- Zpracovat každou položku katalogu v posloupnosti:
- Stáhněte a deserializovat položku katalogu.
- Odpovídajícím způsobem reagovat na typ položky katalogu.
- Zpracovat dokument položky katalogu způsobem specifickým pro klienta.
- Poznamenejte si časové razítko potvrzení poslední položky katalogu jako novou hodnotu kurzoru.
Pomocí tohoto upraveného algoritmu můžete vytvořit systém závislých klientů katalogu, kteří vytvářejí vlastní specifické indexy, artefakty atd.