Catálogo
El catálogo es un recurso que registra todas las operaciones de paquete en un origen de paquete, como las creaciones y eliminaciones. El recurso de catálogo tiene el tipo Catalog
en el índice de servicio. Puedes utilizar este recurso para consultar todos los paquetes publicados.
Nota
Dado que el cliente de NuGet oficial no utiliza el catálogo, no todos los orígenes de paquetes lo implementan.
Nota
Actualmente, el catálogo de nuget.org no está disponible en China. Para obtener más información, consulta NuGet/NuGetGallery#4949.
Se utiliza el siguiente valor de @type
:
Valor de @type | Notas |
---|---|
Catalog/3.0.0 | La versión inicial |
La dirección URL de punto de entrada para las siguientes API es el valor de la propiedad @id
asociada a los valores @type
de recurso mencionados anteriormente. En este tema se utiliza la dirección URL {@id}
de marcador de posición.
Todas las direcciones URL que se encuentran en el recurso de registro admiten solo los métodos HTTP GET
y HEAD
.
El índice de catálogo es un documento en una ubicación conocida que incluye una lista de elementos de catálogo ordenados cronológicamente. Se trata del punto de entrada del recurso de catálogo.
El índice se compone de páginas de catálogo. Cada página de catálogo contiene elementos de catálogo. Cada elemento de catálogo representa un evento relativo a un único paquete en un momento dado. Un elemento de catálogo puede representar un paquete que se creó, se anuló de una lista, se volvió a incluir en ella o se eliminó del origen del paquete. Al procesar los elementos de catálogo en orden cronológico, el cliente puede crear una vista actualizada de cada paquete que exista en el origen del paquete V3.
En resumen, los blobs de catálogo tienen la siguiente estructura jerárquica:
- Índice: el punto de entrada del catálogo.
- Página: una agrupación de elementos de catálogo.
- Hoja: un documento que representa un elemento de catálogo, que es una instantánea del estado de un único paquete.
Cada objeto de catálogo tiene una propiedad denominada commitTimeStamp
que representa el momento en el que el elemento se agregó al catálogo. Los elementos de catálogo se agregan a una página de catálogo en unos lotes llamados “confirmaciones”. Todos los elementos de catálogo de la misma confirmación tienen la misma marca de tiempo de confirmación (commitTimeStamp
) y el mismo identificador de confirmación (commitId
). Los elementos de catálogo colocados en la misma confirmación representan eventos que se produjeron alrededor del mismo momento en el origen del paquete. No hay ningún orden dentro de una confirmación de catálogo.
Dado que cada id. y versión de paquete es único, nunca habrá más de un elemento de catálogo en una confirmación. Esto garantiza que los elementos de catálogo de un único paquete siempre se puedan ordenar sin ambigüedades con respecto a la marca de tiempo de confirmación.
Nunca hay más de una confirmación en el catálogo por commitTimeStamp
. En otras palabras, el commitId
redundante con el commitTimeStamp
.
A diferencia del recurso de metadatos del paquete, que se indexa por id. de paquete, el catálogo solo se indexa (y se puede consultar) por tiempo.
Los elementos de catálogo siempre se agregan al catálogo en un orden cronológico que aumenta con monotonicidad. Esto significa que, si se agrega una confirmación de catálogo en el momento X, nunca se agregará ninguna confirmación de catálogo con un tiempo menor o igual que X.
La solicitud siguiente captura el índice del catálogo.
GET {@id}
El índice de catálogo es un documento JSON que contiene un objeto con las siguientes propiedades:
Nombre | Type | Obligatorio | Notas |
---|---|---|---|
commitId | string | sí | Un id. exclusivo asociado a la confirmación más reciente |
commitTimeStamp | string | sí | Marca de tiempo de la confirmación más reciente |
count | integer | sí | Número de páginas del índice |
items | matriz de objetos | sí | Matriz de objetos, cada uno de los cuales representa una página |
Cada elemento de la matriz items
es un objeto con algunos detalles mínimos sobre cada página. Estos objetos de página no contienen las hojas del catálogo (elementos). El orden de los elementos de esta matriz no está definido. El cliente puede ordenar páginas en la memoria por medio de su propiedad commitTimeStamp
.
A medida que se introducen nuevas páginas, count
se incrementará y aparecerán nuevos objetos en la matriz items
.
Conforme se vayan agregando elementos al catálogo, el commitId
del índice cambiará y el commitTimeStamp
aumentará. Estas dos propiedades son básicamente un resumen de todos los valores commitId
y commitTimeStamp
de página de la matriz items
.
Los objetos de página de catálogo que se encuentran en la propiedad items
del índice de catálogo tienen las siguientes propiedades:
Nombre | Type | Obligatorio | Notas |
---|---|---|---|
@id | string | sí | Dirección URL para capturar la página de catálogo |
commitId | string | sí | Id. exclusivo asociado a la confirmación más reciente de esta página |
commitTimeStamp | string | sí | Marca de tiempo de la confirmación más reciente en esta página |
count | integer | sí | Número de elementos en la página de catálogo |
A diferencia del recurso de metadatos del paquete, que, en algunos casos, inserta hojas en el índice, las hojas de catálogo nunca se insertan en el índice y siempre se deben capturar por medio de la dirección URL @id
de la página.
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
}
]
}
La página de catálogo es una colección de elementos de catálogo. Se trata de un documento capturado mediante uno de los valores @id
que se encuentran en el índice de catálogo. La dirección URL que lleva a una página de catálogo no está pensada para ser predecible y debe descubrirse utilizando solo el índice de catálogo.
Los nuevos elementos de catálogo se agregan a la página del índice de catálogo solo con la marca de tiempo de confirmación más alta, o bien a una página nueva. Una vez que se agrega al catálogo una página con una marca de tiempo de confirmación superior, ya no se agregan ni se cambian páginas anteriores.
El documento de la página de catálogo es un objeto JSON con las siguientes propiedades:
Nombre | Type | Obligatorio | Notas |
---|---|---|---|
commitId | string | sí | Id. exclusivo asociado a la confirmación más reciente de esta página |
commitTimeStamp | string | sí | Marca de tiempo de la confirmación más reciente en esta página |
count | integer | sí | Número de elementos en la página |
items | matriz de objetos | sí | Elementos de catálogo en esta página |
primario | string | sí | Dirección URL al índice del catálogo |
Cada elemento de la matriz items
es un objeto con algunos detalles mínimos sobre el elemento de catálogo. Estos objetos de elemento no contienen todos los datos del elemento de catálogo. El orden de los elementos de la matriz items
de la página no está definido. El cliente puede ordenar los elementos en la memoria por medio de su propiedad commitTimeStamp
.
La implementación del servidor define el número de elementos de catálogo de una página. Para nuget.org existen, como máximo, 550 elementos en cada página, aunque el número real puede ser inferior para algunas páginas en función del tamaño del siguiente lote de confirmación en un momento dado.
A medida que se introducen nuevos elementos, el count
se incrementa y aparecen nuevos objetos de elemento de catálogo en la matriz items
.
A medida que se agregan elementos a la página, el commitId
cambia y la commitTimeStamp
aumenta. Estas dos propiedades son básicamente un resumen de todos los valores commitId
y commitTimeStamp
de la matriz items
.
Los objetos de elemento de catálogo que se encuentran en la propiedad items
de la página de catálogo tienen las siguientes propiedades:
Nombre | Type | Obligatorio | Notas |
---|---|---|---|
@id | string | sí | Dirección URL para capturar el elemento de catálogo |
@type | string | sí | Tipo de elemento de catálogo. |
commitId | string | sí | Id. de confirmación asociado a este elemento de catálogo |
commitTimeStamp | string | sí | Marca de tiempo de confirmación de este elemento de catálogo |
nuget:id | string | sí | Id. del paquete con el que está relacionada esta hoja. |
nuget:version | string | sí | Versión del paquete con el que está relacionada esta hoja |
El valor @type
puede ser uno de los siguientes:
nuget:PackageDetails
: se corresponde con el tipoPackageDetails
en el documento de hoja del catálogo.nuget:PackageDelete
: se corresponde con el tipoPackageDelete
en el documento de hoja del catálogo.
Para obtener más información sobre lo que significa cada tipo, consulta el tipo de elemento correspondiente a continuación.
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"
}
]
}
La hoja de catálogo contiene metadatos sobre un id. de paquete y una versión específicos en un momento dado. Se trata de un documento capturado mediante el valor @id
que se incluye en una página de catálogo. La dirección URL que lleva a una hoja de catálogo no está pensada para ser predecible y debe descubrirse utilizando solo la página de catálogo.
El documento de la hoja de catálogo es un objeto JSON con las siguientes propiedades:
Nombre | Type | Obligatorio | Notas |
---|---|---|---|
@type | cadena o matriz de cadenas | sí | Tipos de elementos de catálogo |
catalog:commitId | string | sí | Id. de confirmación asociado a este elemento de catálogo |
catalog:commitTimeStamp | string | sí | Marca de tiempo de confirmación de este elemento de catálogo |
id | string | sí | Id. de paquete del elemento de catálogo |
published | string | sí | Fecha de publicación del elemento de catálogo del paquete |
version | string | sí | Versión de paquete del elemento de catálogo |
La propiedad @type
es una cadena o una matriz de cadenas. Para mayor comodidad, si el valor @type
es una cadena, se debe tratar como cualquier matriz de tamaño uno. No se documentan todos los valores posibles de @type
. Sin embargo, cada elemento de catálogo tiene exactamente uno de los dos valores de tipo de cadena siguientes:
PackageDetails
: representa una instantánea de los metadatos del paquetePackageDelete
: representa un paquete que se eliminó
Los elementos de catálogo con el tipo PackageDetails
contienen una instantánea de los metadatos de paquete para un paquete específico (combinación de id. y versión). Un elemento de catálogo de los detalles del paquete se genera cuando un origen de paquete se encuentra en cualquiera de los escenarios siguientes:
- Un paquete se inserta.
- Un paquete se vuelve a incluir en una lista.
- Un paquete se quita de una lista.
- Un paquete está en desuso.
- Un paquete vuelve a utilizarse.
- Un paquete se vuelve a distribuir.
- El estado de vulnerabilidad de un paquete se actualiza.
La redistribución de un paquete es un gesto administrativo que básicamente genera una inserción falsa de un paquete existente sin cambios en el propio paquete. En nuget.org, la redistribución se utiliza cuando se corrige un error en uno de los trabajos en segundo plano que consumen el catálogo.
Los clientes que consumen los elementos de catálogo no deben intentar determinar cuál de estos escenarios generó el elemento de catálogo. En su lugar, el cliente simplemente debe actualizar cualquier vista o índice mantenidos con los metadatos que contiene el elemento de catálogo. Además, los elementos de catálogo duplicados o redundantes deben manipularse correctamente (de manera idempotente).
Los elementos de catálogo de los detalles del paquete tienen las siguientes propiedades además de las incluidas en todas las hojas de catálogo.
Nombre | Type | Obligatorio | Notas |
---|---|---|---|
authors | string | no | |
created | string | no | Marca de tiempo de la primera vez que se creó el paquete. Propiedad “Fallback”: published . |
dependencyGroups | matriz de objetos | no | Dependencias del paquete, agrupadas por plataforma de destino (el mismo formato que el recurso de metadatos del paquete) |
deprecation | object | no | Desuso asociado al paquete (el mismo formato que el recurso de metadatos del paquete) |
descripción | string | no | |
iconUrl | string | no | |
isPrerelease | boolean | no | Si la versión del paquete es preliminar o no. Se puede detectar a partir del valor version . |
language | string | no | |
licenseUrl | string | no | |
lista | boolean | no | Indica si el paquete aparece o no en la lista |
minClientVersion | string | no | |
packageHash | string | sí | Hash del paquete, codificación mediante base 64 estándar |
packageHashAlgorithm | string | sí | |
packageSize | integer | sí | Tamaño del .nupkg del paquete en bytes |
packageTypes | matriz de objetos | no | Tipos de paquete especificados por el autor |
projectUrl | string | no | |
releaseNotes | string | no | |
requireLicenseAgreement | boolean | no | Se debe asumir false si se excluye |
summary | string | no | |
etiquetas | matriz de cadenas | no | |
title | string | no | |
verbatimVersion | string | no | Cadena de versión tal y como se encuentra originalmente en .nuspec |
vulnerabilities | matriz de objetos | no | Vulnerabilidades de seguridad del paquete |
La propiedad version
del paquete es la cadena de versión completa después de la normalización. Esto significa que es posible incluir aquí los datos de generación de SemVer 2.0.0.
La marca de tiempo created
indica cuándo el origen de paquete recibió el paquete por primera vez, lo cual sucede, normalmente, poco tiempo antes de la marca de tiempo de confirmación del elemento de catálogo.
packageHashAlgorithm
es una cadena definida por la implementación del servidor que representa el algoritmo hash utilizado para generar el packageHash
. nuget.org siempre ha utilizado el valor packageHashAlgorithm
de SHA512
.
La propiedad packageTypes
solo estará presente si el autor ha especificado un tipo de paquete. Si está presente, siempre tendrá al menos una (1) entrada. Cada elemento de la matriz packageTypes
es un objeto JSON que consta de las siguientes propiedades:
Nombre | Type | Obligatorio | Notas |
---|---|---|---|
name | string | sí | Nombre del tipo de paquete. |
version | string | no | Versión del tipo de paquete. Solo está presente si el autor ha especificado explícitamente una versión en nuspec. |
La marca de tiempo published
es la hora en la que se muestra por última vez el paquete.
Nota
En nuget.org, el valor published
se ajusta en el año 1900, cuando el paquete no aparece en la lista.
Una matriz de objetos vulnerability
. Cada vulnerabilidad tiene las siguientes propiedades:
Nombre | Type | Obligatorio | Notas |
---|---|---|---|
advisoryUrl | string | sí | Ubicación del aviso de seguridad para el paquete |
severity | string | sí | Gravedad de la advertencia: "0" = Baja, "1" = Moderada, "2" = Alta, "3" = Crítica |
Si la propiedad severity
contiene valores distintos de los que aparecen aquí, la gravedad de la advertencia se tratará como “baja”.
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"
}
]
}
Los elementos de catálogo con el tipo PackageDelete
contienen un conjunto mínimo de información que indica a los clientes del catálogo que un paquete se ha eliminado del origen del paquete y ya no está disponible para ninguna operación de paquetes (como la restauración).
Nota
Es posible que un paquete se elimine y se vuelva a publicar más adelante con el mismo id. de paquete y la misma versión. En nuget.org, esto no suele ocurrir, ya que contradice la hipótesis del cliente oficial de que un id. y una versión de paquete implican un contenido de paquete específico. Para obtener más información sobre la eliminación de paquetes en nuget.org, consulta nuestra directiva.
Los elementos de catálogo de eliminación del paquete no tienen propiedades adicionales aparte de las incluidas en todas las hojas de catálogo.
La propiedad version
es la cadena de versión original que se encuentra en el paquete .nuspec.
La propiedad published
indica cuándo se eliminó el paquete, lo cual sucede, normalmente, poco tiempo antes de la marca de tiempo de confirmación del elemento de catálogo.
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"
}
En esta sección se describe un concepto de cliente que, aunque no tiene por qué ordenarlo el protocolo, debe formar parte de cualquier implementación práctica del cliente del catálogo.
Dado que el catálogo es una estructura de datos de solo anexar que se indexa por tiempo, el cliente debe almacenar un cursor de forma local para indicar hasta qué momento el cliente ha procesado elementos de catálogo. Nota: Este valor de cursor nunca se debe generar mediante el reloj de la máquina del cliente. En su lugar, el valor debe provenir del valor commitTimestamp
de un objeto del catálogo.
Cada vez que el cliente quiera procesar nuevos eventos en el origen del paquete, solo necesita consultar el catálogo para ver todos los elementos de catálogo con una marca de tiempo de confirmación mayor que el cursor almacenado. Después de que el cliente procese correctamente los nuevos elementos de catálogo, también registra la marca de tiempo de confirmación más reciente de los elementos de catálogo que se acaban de procesar como su nuevo valor de cursor.
Con este sistema, el cliente puede asegurarse de no perder nunca ningún evento de paquete que se haya producido en el origen del paquete. Además, así el cliente nunca tiene que volver a procesar eventos que se produjeron antes de la marca de tiempo de confirmación registrada del cursor.
Este potente concepto de cursores se utiliza para muchos trabajos en segundo plano de nuget.org y para mantener actualizada la API V3.
Cuando el cliente de catálogo se inicia por primera vez (y, por tanto, no tiene ningún valor de cursor), debe utilizar un valor predeterminado del System.DateTimeOffset.MinValue
de .NET o alguna noción análoga de marca de tiempo mínima que se pueda representar.
Para consultar el siguiente conjunto de elementos de catálogo que se van a procesar, el cliente debe realizar estas acciones:
- Capturar el valor de cursor registrado de un almacén local.
- Descargar y deserializar el índice del catálogo.
- Buscar todas las páginas del catálogo con una marca de tiempo de confirmación mayor que la del cursor.
- Declarar una lista vacía de elementos de catálogo que se van a procesar.
- Para cada página de catálogo correspondiente en el paso 3:
- Descargar y deserializar la página del catálogo.
- Buscar todos los elementos del catálogo con una marca de tiempo de confirmación mayor que la del cursor.
- Agregar todos los elementos de catálogo correspondientes a la lista declarada en el paso 4.
- Ordenar la lista de elementos de catálogo por marca de tiempo de confirmación.
- Procesar cada elemento del catálogo en secuencia:
- Descargar y deserializar el elemento de catálogo.
- Reaccionar adecuadamente al tipo de elemento de catálogo.
- Procesar el documento de elemento de catálogo en la forma específica del cliente.
- Registrar la última marca de tiempo de confirmación del elemento de catálogo como el nuevo valor del cursor.
Con este algoritmo básico, la implementación del cliente puede crear una vista completa de todos los paquetes disponibles en el origen del paquete. El cliente solo necesita ejecutar este algoritmo periódicamente para estar al tanto siempre de los cambios más recientes en el origen del paquete.
Nota
Este es el algoritmo que nuget.org utiliza para mantener actualizados los recursos Metadatos del paquete, Contenido del paquete, Búsqueda y Autocompletar.
Supongamos que hay dos clientes de catálogo que tienen una dependencia inherente en la que la salida de un cliente depende de la salida de otro.
Por ejemplo, en nuget.org, un paquete recién publicado no debería aparecer en el recurso de búsqueda antes de que lo haga en el recurso de metadatos del paquete. Esto se debe a que la operación de “restauración” realizada por el cliente oficial de NuGet utiliza el recurso de metadatos del paquete. Si un cliente descubre un paquete mediante el servicio Search, debería poder restaurar correctamente ese paquete mediante el recurso de metadatos del paquete. En otras palabras, el recurso de búsqueda depende del recurso de metadatos del paquete. Cada recurso tiene un trabajo en segundo plano del cliente de catálogo que actualiza ese recurso. Cada cliente tiene su propio cursor.
Dado que ambos recursos se crean fuera del catálogo, el cursor del cliente de catálogo que actualiza el recurso de búsqueda no debe ir más lejos que el cursor del cliente del catálogo de metadatos del paquete.
Para implementar esta restricción, solo tienes que modificar el algoritmo anterior con estas acciones:
- Capturar el valor de cursor registrado de un almacén local.
- Descargar y deserializar el índice del catálogo.
- Buscar todas las páginas del catálogo con una marca de tiempo de confirmación mayor que la del cursor y menor o igual que la del cursor de la dependencia.
- Declarar una lista vacía de elementos de catálogo que se van a procesar.
- Para cada página de catálogo correspondiente en el paso 3:
- Descargar y deserializar la página del catálogo.
- Buscar todos los elementos de catálogo con una marca de tiempo de confirmación mayor que la del cursor y menor o igual que la del cursor de la dependencia.
- Agregar todos los elementos de catálogo correspondientes a la lista declarada en el paso 4.
- Ordenar la lista de elementos de catálogo por marca de tiempo de confirmación.
- Procesar cada elemento del catálogo en secuencia:
- Descargar y deserializar el elemento de catálogo.
- Reaccionar adecuadamente al tipo de elemento de catálogo.
- Procesar el documento de elemento de catálogo en la forma específica del cliente.
- Registrar la última marca de tiempo de confirmación del elemento de catálogo como el nuevo valor del cursor.
Con este algoritmo modificado, puedes crear un sistema de clientes de catálogo dependientes que generen sus propios índices, artefactos, etc.