Metadatos de paquete

Es posible capturar metadatos sobre los paquetes disponibles en un origen de paquete mediante la API de NuGet V3. Estos metadatos se pueden capturar mediante el recurso RegistrationsBaseUrl que se encuentra en el índice de servicio.

La colección de los documentos que se encuentran en RegistrationsBaseUrl a menudo se denomina “registros” o “blobs de registro”. El conjunto de documentos en un único RegistrationsBaseUrl se conoce como “subárbol de registro”. Un subárbol de registro contiene metadatos sobre todos los paquetes disponibles en un origen de paquete.

Nota:

El recurso de metadatos del paquete no contiene todos los metadatos de los paquetes. Utiliza el recurso de búsqueda para buscar los propietarios, las descargas o el estado de reserva de prefijo de los paquetes.

Control de versiones

Se usan los siguientes valores @type:

Valor de @type Notas
RegistrationsBaseUrl La versión inicial
RegistrationsBaseUrl/3.0.0-beta Alias de RegistrationsBaseUrl
RegistrationsBaseUrl/3.0.0-rc Alias de RegistrationsBaseUrl
RegistrationsBaseUrl/3.4.0 Respuestas en formato GZIP
RegistrationsBaseUrl/3.6.0 Incluye paquetes de SemVer 2.0.0

Esto representa tres subárboles de registro distintos disponibles para diversas versiones de cliente.

RegistrationsBaseUrl

Estos registros no están comprimidos, lo que significa que utilizan un valor Content-Encoding: identity implícito. Los paquetes de SemVer 2.0.0 se excluyen de este subárbol.

RegistrationsBaseUrl/3.4.0

Estos registros se comprimen mediante Content-Encoding: gzip. Los paquetes de SemVer 2.0.0 se excluyen de este subárbol.

RegistrationsBaseUrl/3.6.0

Estos registros se comprimen mediante Content-Encoding: gzip. Los paquetes de SemVer 2.0.0 se incluyen en este subárbol. Para obtener más información sobre SemVer 2.0.0, consulta la compatibilidad con SemVer 2.0.0 para nuget.org.

URL base

La dirección URL base de las siguientes API es el valor de la propiedad @id asociada a uno de los valores @type de los recursos mencionados anteriormente. En el documento siguiente, se usará la dirección URL base del marcador de posición {@id}. La dirección URL base puede cambiar en función de los cambios de implementación o infraestructura dentro del origen del paquete, por lo que el software cliente debe capturarla dinámicamente desde el índice de servicio.

Métodos HTTP

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

Índice de registro

El recurso de registro agrupa los metadatos de los paquetes por id. de paquete. No es posible obtener datos sobre más de un id. de paquete a la vez. Este recurso no proporciona ninguna forma de descubrir id. de paquete. En su lugar, se supone que el cliente ya conoce el id. de paquete deseado. Los metadatos disponibles sobre cada versión del paquete varían según la implementación del servidor. Los blobs de registro de paquetes tienen la siguiente estructura jerárquica:

  • Índice: punto de entrada de los metadatos del paquete, compartido por todos los paquetes de un origen con el mismo id. de paquete.
  • Página: una agrupación de versiones de paquete. La implementación del servidor define el número de versiones de paquete de una página.
  • Hoja: un documento específico de una sola versión de paquete.

La dirección URL del índice de registro es predecible y el cliente puede determinarla por el id. de paquete y el valor @id del recurso de registro que incluye el índice de servicio. Las direcciones URL de las páginas de registro y las hojas se descubren inspeccionando el índice de registro.

Páginas de registro y hojas

Aunque no es estrictamente necesario que una implementación del servidor almacene hojas de registro en documentos de página de registro independientes, se recomienda conservar la memoria del lado cliente. En lugar de insertar todas las hojas de registro en el índice o almacenar inmediatamente las hojas en documentos de página, se recomienda que la implementación del servidor defina cierta heurística para elegir entre los dos enfoques en función del número de versiones del paquete o el tamaño acumulado de hojas de este.

El almacenamiento de todas las versiones de paquete (hojas) en el índice de registro disminuye el número de solicitudes HTTP necesarias para capturar metadatos del paquete, pero obliga a descargar un documento mayor y a asignar más memoria de cliente. Por otro lado, si la implementación del servidor almacena inmediatamente las hojas de registro en documentos de página independientes, el cliente debe realizar más solicitudes HTTP para obtener la información que necesita.

La heurística que nuget.org utiliza es la siguiente: si hay 128 o más versiones de un paquete, el sistema divide las hojas en páginas de tamaño 64. Si hay menos de 128 versiones, inserta todas las hojas en el índice de registro. Ten en cuenta que esto significa que los paquetes con entre 65 y 127 versiones tendrán dos páginas en el índice, pero ambas páginas se insertarán.

GET {@id}/{LOWER_ID}/index.json

Parámetros de solicitud

Nombre En Tipo Obligatorio Notas
LOWER_ID Dirección URL string Id. del paquete, en minúsculas

El valor LOWER_ID es el id. de paquete deseado escrito en minúsculas mediante las reglas implementadas por el método System.String.ToLowerInvariant() de .NET.

Respuesta

La respuesta es un documento JSON que tiene un objeto raíz con las siguientes propiedades:

Nombre Type Obligatorio Notas
count integer Número de páginas de registro en el índice
items matriz de objetos Matriz de páginas de registro

Cada elemento de la matriz items del objeto del índice es un objeto JSON que representa una página de registro.

Objeto de página de registro

El objeto de página de registro que se encuentra en el índice de registro tiene las siguientes propiedades:

Nombre Type Obligatorio Notas
@id string Dirección URL de la página de registro
count integer Número de hojas de registro en la página
items matriz de objetos no Matriz de hojas de registro y sus metadatos asociados
lower string Versión más baja de SemVer 2.0.0 de la página (incluida)
primario string no Dirección URL del índice de registro
upper string Versión más alta de SemVer 2.0.0 de la página (incluida)

Los límites lower y upper del objeto de página resultan útiles cuando se necesitan los metadatos de una versión de página específica. Estos límites se pueden utilizar para capturar la única página de registro necesaria. Las cadenas de versión cumplen las reglas de versión de NuGet. Las cadenas de versión están normalizadas y no incluyen metadatos de generación. Al igual que ocurre con todas las versiones del ecosistema de NuGet, la comparación de cadenas de versión se implementa mediante las reglas de precedencia de versión de SemVer 2.0.0.

La propiedad parent solo aparecerá si el objeto de página de registro tiene la propiedad items.

Si la propiedad items no está presente en el objeto de página de registro, debe utilizarse la dirección URL especificada en el @id para capturar metadatos sobre versiones de paquete individuales. La matriz items a veces se excluye del objeto de página a modo de optimización. Si el número de versiones de un único id. de paquete es muy grande, el documento del índice de registro será demasiado grande y un desperdicio a la hora de procesar para un cliente al que solo le interesa una versión específica o un pequeño intervalo de versiones.

Ten en cuenta que si la propiedad items está presente, no será necesario utilizar la propiedad @id, puesto que todos los datos de la página ya estarán insertados en la propiedad items.

Cada elemento de la matriz items del objeto de página es un objeto JSON que representa una hoja de registro y sus metadatos asociados.

Objeto de hoja de registro en una página

El objeto de hoja de registro que se incluye en una página de registro tiene las siguientes propiedades:

Nombre Type Obligatorio Notas
@id string Dirección URL de la hoja de registro
catalogEntry object Entrada de catálogo que contiene los metadatos del paquete
packageContent string Dirección URL del contenido del paquete (.nupkg)

Cada objeto de hoja de registro representa los datos asociados a una sola versión del paquete.

Entrada de catálogo

La propiedad catalogEntry del objeto de hoja de registro tiene las siguientes propiedades:

Nombre Type Obligatorio Notas
@id string Dirección URL del documento utilizado para generar este objeto
authors cadena o matriz de cadenas no
dependencyGroups matriz de objetos no Dependencias del paquete, agrupadas por plataforma de destino
deprecation object no Estado de desuso asociado al paquete
descripción string no
iconUrl string no
id string Id. del paquete
language string no
licenseUrl string no
licenseExpression string no
lista boolean no Debe considerarse como que está en la lista si está ausente
minClientVersion string no
packageContent string no Duplicado de la misma propiedad en el objeto primario, incluido solo porque es antiguo
projectUrl string no
published string no Cadena que contiene una marca de tiempo ISO 8601 de cuando se publicó el paquete
readmeUrl string no Dirección URL de la vista representada (página web HTML) del archivo LÉAME del paquete
requireLicenseAcceptance boolean no
summary string no
etiquetas cadena o matriz de cadenas no
title string no
version string Cadena de versión completa después de la normalización
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 propiedad dependencyGroups es una matriz de objetos que representa las dependencias del paquete, agrupadas por plataforma de destino. Si el paquete no tiene dependencias, quiere decir que falta la propiedad dependencyGroups, que la matriz está vacía o que falta la propiedad dependencies de todos los grupos o bien está vacía.

El valor de la propiedad licenseExpression cumple con la sintaxis de expresión de licencia de NuGet.

Nota:

En nuget.org, el valor published se ajusta en el año 1900, cuando el paquete no está en la lista.

Grupo de dependencias de paquete

Cada objeto de grupo de dependencias tiene las siguientes propiedades:

Nombre Type Obligatorio Notas
targetFramework string no Plataforma de destino a la que se aplican estas dependencias
dependencies matriz de objetos no

La cadena targetFramework utiliza el formato implementado por la biblioteca .NET de NuGet NuGet.Frameworks. Si no se especifica ningún valor targetFramework, el grupo de dependencias se aplica a todas las plataformas de destino.

La propiedad dependencies es una matriz de objetos, cada una de las cuales representa una dependencia de paquete del paquete actual.

Dependencia de paquete

Cada dependencia de paquete tiene las propiedades siguientes:

Nombre Type Obligatorio Notas
id string Id. de la dependencia de paquete
range object no Intervalo de versiones de la dependencia permitido
registro string no Dirección URL del índice de registro para esta dependencia

Si la propiedad range se excluye o existe una cadena vacía, el cliente debe establecer el intervalo de versiones (, ) como valor predeterminado. Es decir, se permite cualquier versión de la dependencia. El valor de * no está permitido para la propiedad range.

Paquete en desuso

Cada paquete en desuso tiene las propiedades siguientes:

Nombre Type Obligatorio Notas
motivos Matriz de cadenas Razones por las que el paquete está en desuso
message string no Detalles adicionales sobre este desuso
alternatePackage object no El paquete alternativo que se debe utilizar en su lugar

La propiedad reasons debe contener al menos una cadena, y solo debe incluir cadenas de la tabla siguiente:

Motivo Descripción
Heredado El paquete ya no se mantiene
CriticalBugs El paquete tiene errores que hacen que no sea adecuado para su utilización
Otros El paquete está en desuso debido a un motivo que no está en esta lista

Si la propiedad reasons contiene cadenas que no proceden del conjunto conocido, se deben omitir. Las cadenas no distinguen mayúsculas de minúsculas, por lo que legacy se debe tratar igual que Legacy. No hay ninguna restricción de ordenación en la matriz, por lo que las cadenas se pueden organizar en orden arbitrario. Además, si la propiedad contiene solo cadenas que no son del conjunto conocido, se debe tratar como si solo contuviera la cadena “Other”.

Paquete alternativo

El objeto de paquete alternativo tiene las siguientes propiedades:

Nombre Type Obligatorio Notas
id string Id. del paquete alternativo
range object no Intervalo de versiones permitido o *, si se permite alguna versión

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

Solicitud de muestra

GET https://api.nuget.org/v3/registration-sample/nuget.server.core/index.json

Asegúrate de capturar la dirección URL base (https://api.nuget.org/v3/registration-sample/ en este ejemplo) del índice de servicio, tal y como se indica en la sección de la dirección URL base.

Respuesta de muestra

{
  "count": 1,
  "items": [
    {
      "@id": "https://api.nuget.org/v3/registration-sample/nuget.server.core/index.json#page/3.0.0-beta/3.0.0-beta",
      "count": 1,
      "items": [
        {
          "@id": "https://api.nuget.org/v3/registration-sample/nuget.server.core/3.0.0-beta.json",
          "catalogEntry": {
            "@id": "https://api.nuget.org/v3/catalog0/data/2017.10.05.18.41.33/nuget.server.core.3.0.0-beta.json",
            "authors": ".NET Foundation",
            "dependencyGroups": [
              {
                "@id": "https://api.nuget.org/v3/catalog0/data/2017.10.05.18.41.33/nuget.server.core.3.0.0-beta.json#dependencygroup",
                "dependencies": [
                  {
                    "@id": "https://api.nuget.org/v3/catalog0/data/2017.10.05.18.41.33/nuget.server.core.3.0.0-beta.json#dependencygroup/nuget.core",
                    "id": "NuGet.Core",
                    "range": "[2.14.0, )",
                    "registration": "https://api.nuget.org/v3/registration-sample/nuget.core/index.json"
                  }
                ]
              }
            ],
            "description": "Core library for creating a Web Application used to host a simple NuGet feed",
            "iconUrl": "",
            "id": "NuGet.Server.Core",
            "language": "",
            "licenseUrl": "https://raw.githubusercontent.com/NuGet/NuGet.Server/dev/LICENSE.txt",
            "listed": true,
            "minClientVersion": "2.6",
            "packageContent": "https://api.nuget.org/v3-flatcontainer/nuget.server.core/3.0.0-beta/nuget.server.core.3.0.0-beta.nupkg",
            "projectUrl": "https://github.com/NuGet/NuGet.Server",
            "published": "2017-10-05T18:40:32.43+00:00",
            "requireLicenseAcceptance": false,
            "summary": "",
            "tags": [ "" ],
            "title": "",
            "version": "3.0.0-beta",
            "vulnerabilities": [
              {
                "advisoryUrl": "https://github.com/advisories/ABCD-1234-5678-9012",
                "severity": "2"
              }
            ]
          },
          "packageContent": "https://api.nuget.org/v3-flatcontainer/nuget.server.core/3.0.0-beta/nuget.server.core.3.0.0-beta.nupkg",
          "registration": "https://api.nuget.org/v3/registration-sample/nuget.server.core/index.json"
        }
      ],
      "lower": "3.0.0-beta",
      "upper": "3.0.0-beta"
    }
  ]
}

En este caso concreto, el índice de registro tiene la página de registro insertada, por lo que no se necesitan solicitudes adicionales para capturar metadatos sobre versiones de paquete individuales.

Página Registro

La página de registro contiene hojas de registro. La dirección URL para capturar una página de registro viene determinada por la propiedad @id del objeto de página de registro mencionado anteriormente. La dirección URL no está pensada para ser predecible y siempre debe descubrirse mediante el documento de índice.

Advertencia

Da la casualidad que, en nuget.org, la dirección URL del documento de página de registro contiene el límite inferior y superior de la página. Sin embargo, un cliente nunca debe realizar esta hipótesis, ya que las implementaciones del servidor pueden cambiar la forma de la dirección URL siempre que el documento de índice tenga un vínculo válido.

Cuando no se indica la matriz items en el índice de registro, una solicitud HTTP GET del valor @id devolverá un documento JSON que tiene un objeto como raíz. El objeto tiene las siguientes propiedades:

Nombre Type Obligatorio Notas
@id string Dirección URL de la página de registro
count integer Número de hojas de registro en la página
items matriz de objetos Matriz de hojas de registro y sus metadatos asociados
lower string Versión más baja de SemVer 2.0.0 de la página (incluida)
primario string Dirección URL del índice de registro
upper string Versión más alta de SemVer 2.0.0 de la página (incluida)

La forma de los objetos de hoja de registro es la misma que en el índice de registro anterior.

Solicitud de muestra

GET https://api.nuget.org/v3/registration-sample/ravendb.client/page/1.0.531/1.0.729-unstable.json

Asegúrate de capturar la dirección URL base (https://api.nuget.org/v3/registration-sample/ en este ejemplo) del índice de servicio, tal y como se indica en la sección de la dirección URL base.

Respuesta de muestra

{
  "count": 2,
  "lower": "1.0.531",
  "parent": "https://api.nuget.org/v3/registration-sample/nuget.protocol.v3.example/index.json",
  "upper": "1.0.729-unstable",
  "items": [
    {
      "@id": "https://api.nuget.org/v3/registration-sample/nuget.protocol.v3.example/1.0.531.json",
      "@type": "Package",
      "commitId": "e0b9ca79-75b5-414f-9e3e-de9534b5cfd1",
      "commitTimeStamp": "2017-10-26T14:12:19.3439088Z",
      "catalogEntry": {
        "@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.38.37/nuget.protocol.v3.example.1.0.531.json",
        "@type": "PackageDetails",
        "authors": "NuGet.org Team",
        "iconUrl": "https://www.nuget.org/Content/gallery/img/default-package-icon.svg",
        "id": "NuGet.Protocol.V3.Example",
        "licenseUrl": "http://www.opensource.org/licenses/ms-pl",
        "listed": false,
        "packageContent": "https://api.nuget.org/v3-flatcontainer/nuget.protocol.v3.example/1.0.531/nuget.protocol.v3.example.1.0.531.nupkg",
        "projectUrl": "https://github.com/NuGet/NuGetGallery",
        "published": "1900-01-01T00:00:00+00:00",
        "requireLicenseAcceptance": true,
        "title": "NuGet V3 Protocol Example",
        "version": "1.0.531"
      },
      "packageContent": "https://api.nuget.org/v3-flatcontainer/nuget.protocol.v3.example/1.0.531/nuget.protocol.v3.example.1.0.531.nupkg",
      "registration": "https://api.nuget.org/v3/registration-sample/nuget.protocol.v3.example/index.json"
    },
    {
      "@id": "https://api.nuget.org/v3/registration-sample/nuget.protocol.v3.example/1.0.729-unstable.json",
      "@type": "Package",
      "commitId": "e0b9ca79-75b5-414f-9e3e-de9534b5cfd1",
      "commitTimeStamp": "2017-10-26T14:12:19.3439088Z",
      "catalogEntry": {
        "@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.18.22.05/nuget.protocol.v3.example.1.0.729-unstable.json",
        "@type": "PackageDetails",
        "authors": "NuGet.org Team",
        "deprecation": {
          "reasons": [
            "CriticalBugs"
          ],
          "message": "This package is unstable and broken!",
          "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",
        "licenseUrl": "http://www.opensource.org/licenses/ms-pl",
        "listed": false,
        "packageContent": "https://api.nuget.org/v3-flatcontainer/nuget.protocol.v3.example/1.0.729-unstable/nuget.protocol.v3.example.1.0.729-unstable.nupkg",
        "projectUrl": "https://github.com/NuGet/NuGetGallery",
        "published": "1900-01-01T00:00:00+00:00",
        "requireLicenseAcceptance": true,
        "summary": "This package is an example for the V3 protocol.",
        "title": "NuGet V3 Protocol Example",
        "version": "1.0.729-Unstable"
      },
      "packageContent": "https://api.nuget.org/v3-flatcontainer/nuget.protocol.v3.example/1.0.729-unstable/nuget.protocol.v3.example.1.0.729-unstable.nupkg",
      "registration": "https://api.nuget.org/v3/registration-sample/nuget.protocol.v3.example/index.json"
    }
  ]
}

Hoja de registro

La hoja de registro contiene información sobre un id. de paquete y una versión específicos. Es posible que los metadatos sobre la versión específica no estén disponibles en este documento. Los metadatos del paquete se deben capturar desde el índice de registro o la página de registro (la cual se descubre por medio del índice de registro).

La dirección URL para capturar una hoja de registro se obtiene de la propiedad @id de un objeto de hoja de registro en un índice de registro o en una página de registro. Al igual que ocurre con el documento de página, la dirección URL no está pensada para ser predecible y siempre debe descubrirse mediante el objeto de página de registro.

Advertencia

Da la casualidad que, en nuget.org, la dirección URL del documento de hoja de registro contiene la versión del paquete. Sin embargo, un cliente nunca debe realizar esta hipótesis, ya que las implementaciones del servidor pueden cambiar la forma de la dirección URL siempre que el documento primario tenga un vínculo válido.

La hoja de registro es un documento JSON con un objeto raíz con las siguientes propiedades:

Nombre Type Obligatorio Notas
@id string Dirección URL de la hoja de registro
catalogEntry string no Dirección URL de la entrada de catálogo que generó esta hoja
lista boolean no Debe considerarse como que está en la lista si está ausente
packageContent string no Dirección URL del contenido del paquete (.nupkg)
published string no Cadena que contiene una marca de tiempo ISO 8601 de cuando se publicó el paquete
registro string no Dirección URL del índice de registro

Nota:

En nuget.org, el valor published se ajusta en el año 1900, cuando el paquete no está en la lista.

Solicitud de muestra

GET https://api.nuget.org/v3/registration-sample/nuget.versioning/4.3.0.json

Asegúrate de capturar la dirección URL base (https://api.nuget.org/v3/registration-sample/ en este ejemplo) del índice de servicio, tal y como se indica en la sección de la dirección URL base.

Respuesta de muestra

{
  "@id": "https://api.nuget.org/v3/registration-sample/nuget.versioning/4.3.0.json",
  "catalogEntry": "https://api.nuget.org/v3/catalog0/data/2017.08.11.18.24.22/nuget.versioning.4.3.0.json",
  "listed": true,
  "packageContent": "https://api.nuget.org/v3-flatcontainer/nuget.versioning/4.3.0/nuget.versioning.4.3.0.nupkg",
  "published": "2017-08-11T18:24:14.36+00:00",
  "registration": "https://api.nuget.org/v3/registration-sample/nuget.versioning/index.json"
}