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
null
es , 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:
- La coincidencia --
boost
exacta se elige sobreboost*
- Se elige el patrón --
boost*
más largob*
- 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 Registrohttps://github.com/vicroms/vcpkg-registry
(coincidencia exacta enbeicode
)beison
: del Registrohttps://github.com/Microsoft/vcpkg-docs
(coincidencia de patrón enbeison
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:
- Superpone desde la línea de comandos en el orden pasado; a continuación,
- Superposiciones de
vcpkg-configuration.json
en orden; entonces - Superpone las
VCPKG_OVERLAY_[PORTS|TRIPLETS]
variables de entorno en orden.