Compartir a través de


Resolución de nombres de paquete

vcpkg determina el registro responsable (o superposición) de cada paquete antes de llegar a la red. Esto evita ataques de confusión de dependencia de paquetes porque la resolución de nombres no depende de ningún estado externo.

Los pasos del algoritmo de resolución de nombres son:

  • Si el nombre se encuentra en una superposición, use esa superposición; de lo contrario, use esa superposición; en caso contrario,
  • Si hay un "packages" patrón que coincide con el nombre del puerto, use ese registro; de otra manera
  • Si el registro predeterminado no nulles , use ese registro; de lo contrario,
  • No se puede resolver el puerto en un registro.

Cuando hay varios "packages" patrones que coinciden con el nombre, vcpkg da prioridad de la siguiente manera:

  1. La coincidencia -- boost exacta se elige sobre boost*
  2. Se elige el patrón -- boost* más largo b*
  3. Primera coincidencia : se elige el primer registro que declara el mejor patrón.

Ejemplo 1: resolución de nombres de paquete

vcpkg-configuration.json

{
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/microsoft/vcpkg-docs",
      "reference": "vcpkg-registry",
      "baseline": "768f6a3ad9f9b6c4c2ff390137690cf26e3c3453",
      "packages": ["bei*"]
    },
    {
      "kind": "git",
      "repository": "https://github.com/vicroms/vcpkg-registry",
      "baseline": "dacf4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["beicode", "bei*"]
    }
  ]
}

vcpkg.json

{
  "dependencies": [
    "beicode",
    "beison",
    "fmt"
  ],
  "builtin-baseline": "7e7c62d863b1bf599c1d104b76cd8b74475844d4"
}

Dada esta configuración, cada nombre de paquete se resuelve en:

  • beicode: del Registro https://github.com/vicroms/vcpkg-registry (coincidencia exacta en beicode)
  • beison: del Registro https://github.com/Microsoft/vcpkg-docs (coincidencia de patrón en beison y declarado primero en "registries" la matriz)
  • fmt: del registro predeterminado (sin coincidencias)

Dado que varios registros declaran bei*, vcpkg también emitirá una advertencia:

Found the following problems in configuration (path/to/vcpkg-configuration.json):
$ (a configuration object): warning: Package "bei*" is duplicated.
    First declared in:
        location: $.registries[0].packages[0]
        registry: https://github.com/microsoft/vcpkg-docs
    The following redeclarations will be ignored:
        location: $.registries[1].packages[1]
        registry: https://github.com/vicroms/vcpkg-registry

Ejemplo 2: Asignación de varios patrones al registro predeterminado

Puede cambiar el registro predeterminado de dos maneras. En primer lugar, definiendo :"default-registry"

{
  "default-registry": {
    "kind": "git",
    "repository": "https://github.com/Microsoft/vcpkg",
    "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3"
  }
}

En segundo lugar, estableciendo en "default-registry" null y usando el "*" patrón de la "registries" matriz:

{
  "default-registry": null,
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/Microsoft/vcpkg",
      "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
      "packages": ["*"]
    }
  ]
}

Una ventaja del segundo formulario es que puede agregar más entradas a la matriz de paquetes, mientras que el "default-registry" objeto no permite definir una matriz de paquetes en absoluto. Esta diferencia es importante en los casos en los que necesita asegurarse de que un paquete procede del registro predeterminado.

Consideremos un registro que proporciona las bibliotecas de Qt Framework.

vcpkg-configuration.json

{
  "default-registry": {
    "kind": "git",
    "repository": "https://github.com/Microsoft/vcpkg",
    "baseline": "7e7c62d863b1bf599c1d104b76cd8b74475844d4"
  },
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/custom-qt/custom-qt-registry",
      "baseline": "adfc4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["qt*"]
    }
  ]
}

Y las siguientes dependencias del proyecto:

vcpkg.json

{
  "dependencies": [
    "qt5",
    "qt-advanced-docking-system",
    "qtkeychain"
  ]
}

El "qt*" patrón coincide con todos los nombres de puerto de vcpkg.json. ¡Pero hay un problema! Los puertos qt-advanced-docking-system y qtkeychain no forman parte de las bibliotecas oficiales de Qt Framework y, dado que vcpkg no podrá encontrar los puertos en el registro personalizado, se producirá un error en la instalación.

Esto se puede corregir asignando estos paquetes al registro predeterminado en su lugar. Para ello, se cambia la forma en que declaramos el registro predeterminado y agregamos qt-advanced-docking-system y qtkeychain a su "packages" matriz:

vcpkg-configuration.json

{
  "default-registry": null,
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/Microsoft/vcpkg",
      "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
      "packages": ["*", "qt-advanced-docking-system", "qtkeychain"]
    },
    {
      "kind": "git",
      "repository": "https://github.com/custom-qt/custom-qt-registry",
      "baseline": "adfc4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["qt*"]
    }
  ]
}

Dado que las coincidencias exactas se prefieren sobre las coincidencias qt-advanced-docking-system de patrones y qtkeychain se resolverán en el registro predeterminado.

Superposiciones

Las superposiciones son una manera de extender vcpkg con puertos adicionales y tripletas adicionales, sin crear un registro completo. Las superposiciones se consideran antes de realizar cualquier búsqueda o control de versiones del Registro y reemplazarán los triples o puertos integrados. Consulte puertos de superposición para obtener más información.

La configuración de superposición se evalúa en este orden:

  1. Superpone desde la línea de comandos en el orden pasado; a continuación,
  2. Superposiciones de vcpkg-configuration.json en orden; entonces
  3. Superpone las VCPKG_OVERLAY_[PORTS|TRIPLETS] variables de entorno en orden.