Catalogue

Le catalogue est une ressource qui enregistre toutes les opérations de package sur une source de package, telles que les créations et les suppressions. La ressource de catalogue a le type Catalog dans l’index de service. Vous pouvez utiliser cette ressource pour rechercher tous les packages publiés.

Remarque

Étant donné que le catalogue n’est pas utilisé par le client NuGet officiel, toutes les sources de package implémentent le catalogue.

Remarque

Actuellement, le catalogue nuget.org n’est pas disponible en Chine. Pour plus d’informations, consultez NuGet/NuGetGallery#4949.

Contrôle de version

La valeur suivante @type est utilisée :

Valeur @type Notes
Catalogue/3.0.0 La version initiale

URL de base

L’URL de point d'entrée pour les API suivantes est la valeur de la propriété @id associée aux valeurs de ressource @type mentionnées ci-dessus. Ce sujet utilise l’URL de l’espace réservé {@id}.

Méthodes HTTP

Toutes les URL trouvées dans la ressource de catalogue prennent en charge les méthodes HTTP GET et HEAD.

Index de catalogue

L’index de catalogue est un document dans un emplacement bien connu qui a une liste d’articles de catalogue, classés chronologiquement. Il s’agit du point d’entrée de la ressource de catalogue.

L’index est composé de pages de catalogue. Chaque page de catalogue contient des articles de catalogue. Chaque article de catalogue représente un événement concernant un package unique à un moment donné. Un article de catalogue peut représenter un package qui a été créé, non répertorié, répertorié de nouveau ou supprimé de la source du package. En traitant les articles de catalogue dans l’ordre chronologique, le client peut créer une vue à jour de chaque package existant sur la source du package V3.

En bref, les objets blob de catalogue ont la structure hiérarchique suivante :

  • Index : point d’entrée du catalogue.
  • Page : regroupement d’articles de catalogue.
  • Feuille : document représentant un article de catalogue, qui est une instantané de l’état d’un package unique.

Chaque objet catalogue a une propriété appelée commitTimeStamp représentant lorsque l’article a été ajouté au catalogue. Les articles de catalogue sont ajoutés à une page de catalogue par lots appelés validations. Tous les articles de catalogue de la même validation ont le même horodatage de validation (commitTimeStamp) et le même ID de validation (commitId). Les articles de catalogue placés dans la même validation représentent les événements qui se sont produits à un moment donné dans le temps sur la source du package. Il n’existe aucun ordre dans une validation de catalogue.

Étant donné que chaque ID de package et chaque version sont uniques, il n’y aura jamais plus d’un article de catalogue dans une validation. Cela garantit que les articles de catalogue d’un seul package peuvent toujours être triés sans ambiguïté en ce qui concerne l’horodatage de validation.

Il n’y a jamais plus d’une validation dans le catalogue par commitTimeStamp. En d’autres termes, le commitId est redondant avec le commitTimeStamp.

Contrairement à la ressource de métadonnées de package, indexée par ID de package, le catalogue est indexé (et interrogeable) uniquement par heure.

Les articles de catalogue sont toujours ajoutés au catalogue dans un ordre monotonique croissant et chronologique. Cela signifie que si une validation de catalogue est ajoutée au moment X, aucune validation de catalogue n’est jamais ajoutée avec une heure inférieure ou égale à X.

La requête suivante récupère l’index du catalogue.

GET {@id}

L’index de catalogue est un document JSON qui contient un objet avec les propriétés suivantes :

Nom Type Requise Notes
commitID string Oui Un ID unique associé à la validation la plus récente
commitTimeStamp string Oui Un horodatage de la validation la plus récente
count entier Oui Le nombre de pages dans l'index
items tableau d'objets Oui Tableau d’objets, chaque objet représentant une page

Chaque élément du tableau items est un objet avec des détails minimaux sur chaque page. Ces objets de page ne contiennent pas les feuilles de catalogue (articles). L’ordre des éléments de ce tableau n’est pas défini. Les pages peuvent être triées par le client en mémoire à l’aide de sa propriété commitTimeStamp.

À mesure que de nouvelles pages sont introduites, le count sera incrémenté et de nouveaux objets apparaîtront dans le tableau items.

À mesure que les articles sont ajoutés au catalogue, les index commitId changent et augmenteront commitTimeStamp. Ces deux propriétés sont essentiellement un résumé sur toutes les valeurs commitId et commitTimeStamp de page dans le tableau items.

Objet de page de catalogue dans l’index

Les objets de page de catalogue trouvés dans la propriété de l’index de items du catalogue ont les propriétés suivantes :

Nom Type Requise Notes
@id string Oui URL de récupération de la page catalogue
commitID string Oui Un ID unique associé à la validation la plus récente dans cette page
commitTimeStamp string Oui Un horodatage de la validation la plus récente dans cette page
count entier Oui Nombre total d’articles dans la page de catalogue.

Contrairement à la ressource de métadonnées de package qui, dans certains cas, inclut des feuilles dans l’index, les feuilles de catalogue ne sont jamais insérées dans l’index et doivent toujours être récupérées à l’aide de l’URL @id de la page.

Exemple de requête

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

Exemple de réponse

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

Page de catalogue

La page de catalogue est une collection d’articles de catalogue. Il s’agit d’un document récupéré à l’aide de l’une des valeurs @id trouvées dans l’index du catalogue. L’URL d’une page de catalogue n’est pas destinée à être prévisible et doit être découverte uniquement à l’aide de l’index du catalogue.

Les nouveaux articles de catalogue sont ajoutés à la page dans l’index de catalogue uniquement avec l’horodatage de validation le plus élevé ou dans une nouvelle page. Une fois qu’une page avec un horodatage de validation plus élevé est ajoutée au catalogue, les pages plus anciennes ne sont jamais ajoutées ou modifiées.

Le document de page de catalogue est un objet JSON avec les propriétés suivantes :

Nom Type Requise Notes
commitID string Oui Un ID unique associé à la validation la plus récente dans cette page
commitTimeStamp string Oui Un horodatage de la validation la plus récente dans cette page
count entier Oui Le nombre d'articles dans la page.
items tableau d'objets Oui Articles de catalogue dans cette page
parent string Oui Une URL de l’index de catalogue

Chaque article du tableau items est un objet avec des détails minimaux sur l’article de catalogue. Ces objets d’article ne contiennent pas toutes les données de l’article de catalogue. L’ordre des articles du tableau items de la page n’est pas défini. Les articles peuvent être commandés par le client en mémoire à l’aide de leur propriété commitTimeStamp.

Le nombre d’articles de catalogue dans une page est défini par l’implémentation du serveur. Pour nuget.org, il y a au maximum 550 articles dans chaque page, bien que le nombre réel puisse être plus petit pour certaines pages en fonction de la taille du lot de validation suivant au point dans le temps.

À mesure que de nouveaux articles sont introduits, le count est incrémenté et les nouveaux objets d’article de catalogue apparaissent dans le tableau items.

À mesure que les articles sont ajoutés à la page, le commitId est modifié et le commitTimeStamp augmente. Ces deux propriétés sont essentiellement un résumé sur toutes les valeurs commitId et commitTimeStamp dans le tableau items.

Objet d’article de catalogue dans une page

Les objets d’article de catalogue trouvés dans la propriété items de la page de catalogue ont les propriétés suivantes :

Nom Type Requise Notes
@id string Oui URL permettant de récupérer l’article de catalogue
@type string Oui Le type d’article de catalogue
commitID string Oui ID de validation associé à cet article de catalogue
commitTimeStamp string Oui L’horodatage de validation de cet article de catalogue
nuget:id string Oui ID de package auquel cette feuille est liée
nuget:version string Oui Version du package à laquelle cette feuille est liée

Les valeurs @type possibles sont l’une des deux valeurs suivantes :

  1. nuget:PackageDetails : cela correspond au type PackageDetails dans le document feuille de catalogue.
  2. nuget:PackageDelete : cela correspond au type PackageDelete dans le document feuille de catalogue.

Pour plus d’informations sur ce que signifie chaque type, consultez le type d’articles correspondant ci-dessous.

Exemple de requête

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

Exemple de réponse

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

Feuille de catalogue

La feuille de catalogue contient des métadonnées sur un ID de package et une version spécifiques à un moment donné. Il s’agit d’un document récupéré à l’aide de la valeur @id trouvée dans une page de catalogue. L’URL d’une feuille de catalogue n’est pas destinée à être prévisible et doit être découverte à l’aide d’une page de catalogue uniquement.

Le document feuille de catalogue est un objet JSON avec les propriétés suivantes :

Nom Type Requise Notes
@type chaîne ou tableau de chaînes Oui Le ou les types d’articles de catalogue
catalog:commitId string Oui ID de validation associé à cet article de catalogue
catalog:commitTimeStamp string Oui L’horodatage de validation de cet article de catalogue
id string Oui L’ID de package de l’article du catalogue
published string Oui Date de publication de l’article de catalogue de packages
version chaîne Oui Version du package de l’article de catalogue

Types d’articles

La propriété @type est une chaîne ou un tableau de chaînes. Par souci de commodité, si la valeur @type est une chaîne, elle doit être traitée comme n’importe quel tableau de taille 1. Toutes les valeurs possibles pour @type sont documentées. Toutefois, chaque article de catalogue a exactement l’une des deux valeurs de type de chaîne suivantes :

  1. PackageDetails : représente une instantané de métadonnées de package
  2. PackageDelete : représente un package qui a été supprimé

articles de catalogue des détails du package

Les articles de catalogue avec le type PackageDetails contiennent un instantané de métadonnées de package pour un ID de package spécifique (combinaison d’ID et de version). Un article de catalogue de détails de package est généré lorsqu’une source de package rencontre l’un des scénarios suivants :

  1. Un package est envoyé.
  2. Un package est répertorié de nouveau.
  3. Un package est retiré de la liste.
  4. Un package est déconseillé.
  5. Un package n’est pas déconseillé.
  6. Un package est ajusté dynamiquement.
  7. L’état des vulnérabilités d’un package est mis à jour.

Un ajustement dynamique de package est un mouvement administratif qui génère essentiellement un faux envoi d’un package existant sans aucune modification du package lui-même. Sur nuget.org, un ajustement dynamique est utilisé après avoir corrigé un bogue dans l’un des travaux en arrière-plan qui consomment le catalogue.

Les clients qui consomment les articles de catalogue ne doivent pas tenter de déterminer quels scénarios ont produit l’article de catalogue. Au lieu de cela, le client doit simplement mettre à jour toute vue ou index maintenu avec les métadonnées contenues dans l’article de catalogue. De plus, les articles de catalogue dupliqués ou redondants doivent être gérés correctement (de manière idempotente).

Les articles de catalogue de détails du package ont les propriétés suivantes en plus de celles incluses dans toutes les feuilles de catalogue.

Nom Type Requise Notes
authors string non
created string non Horodatage du moment où le package a été créé pour la première fois. Propriété de secours : published.
dependencyGroups tableau d'objets non Dépendances du package, regroupées par version cible de .Net Framework (même format que la ressource de métadonnées de package)
abandon object non Abandon associé au package (même format que la ressource de métadonnées du package)
description string non
iconUrl string non
isPrerelease booléen non Indique si la version du package est préversion ou non. Peut être détecté à partir de version.
langue string non
licenseUrl string non
liste booléen non Indique si le package est répertorié ou non
minClientVersion string non
packageHash string Oui Code de hachage du package, encodage à l’aide de la base 64 standard
packageHashAlgorithm string Oui
packageSize entier Oui La taille en octets du package .nupkg
packageTypes tableau d'objets non Types de package spécifiés par l’auteur.
projectUrl string non
releaseNotes string non
requireLicenseAgreement booléen non Supposer si false est exclu
résumé string non
tags tableau de chaînes non
title string non
verbatimVersion string non Chaîne de version telle qu’elle est trouvée à l’origine dans le .nuspec
vulnerabilities tableau d'objets non Les vulnérabilités de sécurité du package

La propriété du package version est la chaîne de version complète après la normalisation. Cela signifie que les données de version SemVer 2.0.0 peuvent être incluses ici.

L’horodatage created est le moment où le package a été reçu pour la première fois par la source du package, ce qui est généralement un court délai avant l’horodatage de validation de l’article de catalogue.

Le packageHashAlgorithm est une chaîne définie par l’implémentation du serveur représentant l’algorithme de hachage utilisé pour produire le packageHash. nuget.org toujours utilisé la packageHashAlgorithm valeur de SHA512.

La propriété packageTypes ne sera présente que si un type de package a été spécifié par l’auteur. Si elle est présente, elle aura toujours au moins une (1) entrée. Chaque article du tableau packageTypes est un objet JSON avec les propriétés suivantes :

Nom Type Requise Notes
name string Oui Le nom du type de package.
version chaîne non La version du type de package. Présente uniquement si l’auteur a spécifié explicitement une version dans le nuspec.

L’horodatage published est l’heure à laquelle le package a été répertorié pour la dernière fois.

Remarque

Sur nuget.org, la valeur published est définie sur l’année 1900 lorsque le package n’est pas répertorié.

Vulnerabilities

Tableau d'objets vulnerability. Chaque vulnérabilité contient les propriétés suivantes :

Nom Type Requise Notes
advisoryUrl string Oui Emplacement de l’avis de sécurité pour le package
severity string Oui Gravité de l’avis : « 0 » = Faible, « 1 » = Modéré, « 2 » = Élevé, « 3 » = Critique

Si la propriété severity contient des valeurs autres que celles répertoriées ici, la gravité de l’avis doit être traitée comme Faible.

Exemple de requête

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

Exemple de réponse

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

Package - Supprimer des articles de catalogue

Les articles de catalogue avec le type PackageDelete contiennent un ensemble minimal d’informations indiquant aux clients catalogue qu’un package a été supprimé de la source du package et qu’il n’est plus disponible pour une opération de package (comme par exemple la restauration).

Remarque

Il est possible qu’un package soit supprimé et republié ultérieurement à l’aide du même ID de package et de la même version. Sur nuget.org, il s’agit d’un cas très rare, car il interrompt l’hypothèse officielle du client qu’un ID de package et une version impliquent un contenu de package spécifique. Pour plus d’informations sur la suppression de package sur nuget.org, consultez notre politique.

Les articles de catalogue de suppression de package n’ont pas de propriétés supplémentaires en plus de celles incluses sur toutes les feuilles de catalogue.

La propriété version est la chaîne de version d’origine trouvée dans le package .nuspec.

La propriété published est l’heure à laquelle le package a été supprimé, ce qui est généralement aussi court avant l’horodatage de validation de l’article de catalogue.

Exemple de requête

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

Exemple de réponse

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

Curseur

Vue d’ensemble

Cette section décrit un concept client qui, même s’il n’est pas nécessairement mandaté par le protocole, doit faire partie de toute implémentation pratique du catalogue par le client.

Étant donné que le catalogue est une structure de données d’ajout uniquement indexée par le temps, le client doit stocker un curseur localement ; il représente jusqu’à quel point dans le temps le client a traité des articles de catalogue. Notez que cette valeur de curseur ne doit jamais être générée à l’aide de l’horloge de l’ordinateur du client. Au lieu de cela, la valeur doit provenir de la valeur commitTimestamp d’un objet catalogue.

Chaque fois que le client souhaite traiter de nouveaux événements sur la source du package, il doit uniquement interroger le catalogue pour tous les articles du catalogue avec un horodatage de validation supérieur à son curseur stocké. Une fois que le client a correctement traité tous les nouveaux articles de catalogue, il enregistre le dernier horodatage de validation des articles de catalogue simplement traité comme sa nouvelle valeur de curseur.

À l’aide de cette approche, le client peut ne jamais manquer d’événements de package qui se sont produits sur la source du package. De plus, le client n’a jamais à retraiter les anciens événements avant l’horodatage de validation enregistré du curseur.

Ce concept puissant de curseurs est utilisé pour de nombreux travaux en arrière-plan nuget.org et est utilisé pour conserver l’API V3 elle-même à jour.

Valeur initiale

Lorsque le client de catalogue démarre pour la première fois (et n’a donc aucune valeur de curseur), il doit utiliser une valeur de curseur par défaut de System.DateTimeOffset.MinValue de .NET ou une telle notion analogue d’horodatage pouvant être représenté au minimum.

Itération sur les articles de catalogue

Pour rechercher l’ensemble suivant d’articles de catalogue à traiter, le client doit :

  1. Récupérez la valeur de curseur enregistrée à partir d’un magasin local.
  2. Téléchargez et désérialisez l’index du catalogue.
  3. Recherchez toutes les pages de catalogue avec un horodatage de validation supérieur au curseur.
  4. Déclarez une liste vide d’articles de catalogue à traiter.
  5. Pour chaque page de catalogue mise en correspondance à l’étape 3 :
    1. Téléchargez et désérialisez la page du catalogue.
    2. Recherchez tous les articles de catalogue avec un horodatage de validation supérieur au curseur.
    3. Ajoutez tous les articles de catalogue correspondants à la liste déclarée à l’étape 4.
  6. Triez la liste des articles de catalogue par horodatage de validation.
  7. Traitez chaque article de catalogue en séquence :
    1. Téléchargez et désérialisez l’article de catalogue.
    2. Réagissez de manière appropriée au type de l’article de catalogue.
    3. Traitez le document d’article de catalogue de manière spécifique au client.
  8. Enregistrez l’horodatage de validation du dernier article de catalogue comme nouvelle valeur de curseur.

Avec cet algorithme de base, l’implémentation du client peut créer une vue complète de tous les packages disponibles sur la source du package. Le client n’a besoin que d’exécuter cet algorithme régulièrement pour toujours connaître les dernières modifications apportées à la source du package.

Remarque

Il s’agit de l’algorithme que nuget.org utilise pour maintenir à jour les ressources de métadonnées de package, de contenu de package, de recherche et d’autocomplétion.

Curseurs dépendants

Supposons qu’il existe deux clients de catalogue qui ont une dépendance inhérente où la sortie d’un client dépend de la sortie d’un autre client.

Exemple

Par exemple, sur nuget.org un package récemment publié ne doit pas apparaître dans la ressource de recherche avant d’apparaître dans la ressource de métadonnées du package. Cela est dû au fait que l’opération de « restauration » effectuée par le client NuGet officiel utilise la ressource de métadonnées de package. Si un client découvre un package à l’aide du service Search, il doit pouvoir restaurer correctement ce package à l’aide de la ressource de métadonnées du package. En d’autres termes, la ressource de recherche dépend de la ressource de métadonnées du package. Chaque ressource a un travail en arrière-plan client catalogue qui met à jour cette ressource. Chaque client a son propre curseur.

Étant donné que les deux ressources sont générées à partir du catalogue, le curseur du client de catalogue qui met à jour la ressource de recherche ne doit pas dépasser le curseur du client du catalogue de métadonnées du package.

Algorithme

Pour implémenter cette restriction, modifiez simplement l’algorithme ci-dessus pour être :

  1. Récupérez la valeur de curseur enregistrée à partir d’un magasin local.
  2. Téléchargez et désérialisez l’index du catalogue.
  3. Recherchez toutes les pages de catalogue avec un horodatage de validation supérieur au curseur inférieur ou égal au curseur de la dépendance.
  4. Déclarez une liste vide d’articles de catalogue à traiter.
  5. Pour chaque page de catalogue mise en correspondance à l’étape 3 :
    1. Téléchargez et désérialisez la page du catalogue.
    2. Recherchez tous les articles de catalogue avec un horodatage de validation supérieur au curseur inférieur ou égal au curseur de la dépendance.
    3. Ajoutez tous les articles de catalogue correspondants à la liste déclarée à l’étape 4.
  6. Triez la liste des articles de catalogue par horodatage de validation.
  7. Traitez chaque article de catalogue en séquence :
    1. Téléchargez et désérialisez l’article de catalogue.
    2. Réagissez de manière appropriée au type de l’article de catalogue.
    3. Traitez le document d’article de catalogue de manière spécifique au client.
  8. Enregistrez l’horodatage de validation du dernier article de catalogue comme nouvelle valeur de curseur.

À l’aide de cet algorithme modifié, vous pouvez créer un système de clients de catalogue dépendants qui produisent tous leurs propres index, artefacts, etc.