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.

Control de versiones

Se utiliza el siguiente valor de @type:

Valor de @type Notas
Catalog/3.0.0 La versión inicial

URL base

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.

Métodos HTTP

Todas las direcciones URL que se encuentran en el recurso de registro admiten solo los métodos HTTP GET y HEAD.

Índice de catálogo

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 Un id. exclusivo asociado a la confirmación más reciente
commitTimeStamp string Marca de tiempo de la confirmación más reciente
count integer Número de páginas del índice
items matriz de objetos 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.

Objeto de página de catálogo en el índice

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 Dirección URL para capturar la página de catálogo
commitId string Id. exclusivo asociado a la confirmación más reciente de esta página
commitTimeStamp string Marca de tiempo de la confirmación más reciente en esta página
count integer 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.

Solicitud de ejemplo

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

Respuesta de muestra

{
  "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
    }
  ]
}

Página de catálogo

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 Id. exclusivo asociado a la confirmación más reciente de esta página
commitTimeStamp string Marca de tiempo de la confirmación más reciente en esta página
count integer Número de elementos en la página
items matriz de objetos Elementos de catálogo en esta página
primario string 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.

Objeto de elemento de catálogo en una página

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 Dirección URL para capturar el elemento de catálogo
@type string Tipo de elemento de catálogo.
commitId string Id. de confirmación asociado a este elemento de catálogo
commitTimeStamp string Marca de tiempo de confirmación de este elemento de catálogo
nuget:id string Id. del paquete con el que está relacionada esta hoja.
nuget:version string Versión del paquete con el que está relacionada esta hoja

El valor @type puede ser uno de los siguientes:

  1. nuget:PackageDetails: se corresponde con el tipo PackageDetails en el documento de hoja del catálogo.
  2. nuget:PackageDelete: se corresponde con el tipo PackageDelete 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.

Solicitud de ejemplo

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

Respuesta de muestra

{
  "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"
    }
  ]
}

Hoja de catálogo

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 Tipos de elementos de catálogo
catalog:commitId string Id. de confirmación asociado a este elemento de catálogo
catalog:commitTimeStamp string Marca de tiempo de confirmación de este elemento de catálogo
id string Id. de paquete del elemento de catálogo
published string Fecha de publicación del elemento de catálogo del paquete
version string Versión de paquete del elemento de catálogo

Tipos de elemento

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:

  1. PackageDetails: representa una instantánea de los metadatos del paquete
  2. PackageDelete: representa un paquete que se eliminó

Elementos de catálogo de los detalles del paquete

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:

  1. Un paquete se inserta.
  2. Un paquete se vuelve a incluir en una lista.
  3. Un paquete se quita de una lista.
  4. Un paquete está en desuso.
  5. Un paquete vuelve a utilizarse.
  6. Un paquete se vuelve a distribuir.
  7. 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 Hash del paquete, codificación mediante base 64 estándar
packageHashAlgorithm string
packageSize integer 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 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.

Vulnerabilidades

Una matriz de objetos vulnerability. Cada vulnerabilidad tiene las siguientes propiedades:

Nombre Type Obligatorio Notas
advisoryUrl string Ubicación del aviso de seguridad para el paquete
severity string 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”.

Solicitud de ejemplo

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

Respuesta de muestra

{
  "@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"
    }
  ]
}

Elementos de catálogo de eliminación del paquete

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.

Solicitud de ejemplo

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

Respuesta de muestra

{
  "@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

Información general

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.

Valor inicial

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.

Iteración sobre elementos de catálogo

Para consultar el siguiente conjunto de elementos de catálogo que se van a procesar, el cliente debe realizar estas acciones:

  1. Capturar el valor de cursor registrado de un almacén local.
  2. Descargar y deserializar el índice del catálogo.
  3. Buscar todas las páginas del catálogo con una marca de tiempo de confirmación mayor que la del cursor.
  4. Declarar una lista vacía de elementos de catálogo que se van a procesar.
  5. Para cada página de catálogo correspondiente en el paso 3:
    1. Descargar y deserializar la página del catálogo.
    2. Buscar todos los elementos del catálogo con una marca de tiempo de confirmación mayor que la del cursor.
    3. Agregar todos los elementos de catálogo correspondientes a la lista declarada en el paso 4.
  6. Ordenar la lista de elementos de catálogo por marca de tiempo de confirmación.
  7. Procesar cada elemento del catálogo en secuencia:
    1. Descargar y deserializar el elemento de catálogo.
    2. Reaccionar adecuadamente al tipo de elemento de catálogo.
    3. Procesar el documento de elemento de catálogo en la forma específica del cliente.
  8. 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.

Cursores dependientes

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.

Ejemplo

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.

Algoritmo

Para implementar esta restricción, solo tienes que modificar el algoritmo anterior con estas acciones:

  1. Capturar el valor de cursor registrado de un almacén local.
  2. Descargar y deserializar el índice del catálogo.
  3. 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.
  4. Declarar una lista vacía de elementos de catálogo que se van a procesar.
  5. Para cada página de catálogo correspondiente en el paso 3:
    1. Descargar y deserializar la página del catálogo.
    2. 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.
    3. Agregar todos los elementos de catálogo correspondientes a la lista declarada en el paso 4.
  6. Ordenar la lista de elementos de catálogo por marca de tiempo de confirmación.
  7. Procesar cada elemento del catálogo en secuencia:
    1. Descargar y deserializar el elemento de catálogo.
    2. Reaccionar adecuadamente al tipo de elemento de catálogo.
    3. Procesar el documento de elemento de catálogo en la forma específica del cliente.
  8. 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.