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.
Puertos de superposición
Los puertos de superposición son una manera de extender vcpkg con puertos adicionales sin crear un registro completo. Las superposiciones se consideran antes de cualquier búsqueda del Registro o consideraciones de control de versiones. Las superposiciones reemplazan los tripletes o puertos integrados. Consulte puertos de superposición para obtener más información.
Los puertos de superposición se evalúan en este orden:
- Superpone desde la línea
--overlay-ports
de comandos en el orden pasado; a continuación, - Superposiciones de
vcpkg-configuration.json
"overlay-ports"
en orden; a continuación, - Superpone las superposiciones de la
VCPKG_OVERLAY_PORTS
variable de entorno en orden.
Tripletas superpuestas
Los tripletes de superposición son una manera de extender vcpkg con tripletes adicionales, sin modificar el directorio de instalación de vcpkg. Las superposiciones se consideran antes de cualquier triplete integrado.
Los tripletes de superposición se evalúan 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 superposiciones de la
VCPKG_OVERLAY_TRIPLETS
variable de entorno en orden.