Resolução de nomes de pacotes
VCPKG determina o registro responsável (ou sobreposição) para cada pacote antes de entrar em contato com a rede. Isso evita ataques de confusão de dependência de pacote porque a resolução de nomes não depende de nenhum estado externo.
As etapas do algoritmo de resolução de nomes são:
- Se o nome for encontrado em uma sobreposição, use essa sobreposição; caso contrário,
- Se houver um
"packages"
padrão que corresponde ao nome da porta, use esse registro; caso contrário - Se o registro padrão não
null
for , use esse registro; caso contrário, - Falha ao resolver a porta para um registro.
Quando há vários "packages"
padrões que correspondem ao nome, vcpkg prioriza da seguinte maneira:
- A correspondência --
boost
exata é escolhida em vez deboost*
- O padrão --
boost*
mais longo é escolhido sobreb*
- Primeira correspondência -- O primeiro registro que declara o melhor padrão é escolhido
Exemplo #1: Resolução de nome de pacote
vcpkg-configuration.json
{
"registries": [
{
"kind": "git",
"repository": "https://github.com/northwindtraders/vcpkg-registry",
"baseline": "dacf4de488094a384ca2c202b923ccc097956e0c",
"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 essa configuração, cada nome de pacote é resolvido para:
beicode
: do registrohttps://github.com/vicroms/vcpkg-registry
(correspondência exata embeicode
)beison
: do registrohttps://github.com/northwindtraders/vcpkg-registry
(correspondência de padrão ativadabeison
e declarada primeiro na"registries"
matriz)fmt
: do registro padrão (sem correspondências)
Como vários registros declaram bei*
, vcpkg também emitirá um aviso:
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/northwindtraders/vcpkg-registry
The following redeclarations will be ignored:
location: $.registries[1].packages[1]
registry: https://github.com/vicroms/vcpkg-registry
Exemplo #2: Atribuir vários padrões ao registro padrão
Você pode alterar o registro padrão de duas maneiras. Primeiro, definindo o "default-registry"
:
{
"default-registry": {
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3"
}
}
Em segundo lugar, definindo o "default-registry"
padrão para null
e usando na "*"
"registries"
matriz:
{
"default-registry": null,
"registries": [
{
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
"packages": ["*"]
}
]
}
Uma vantagem do segundo formulário é que você pode adicionar mais entradas à matriz de pacotes, enquanto o "default-registry"
objeto não permite que você defina uma matriz de pacotes. Essa diferença se torna importante nos casos em que você precisa garantir que um pacote vem do registro padrão.
Vamos considerar um registro que fornece as bibliotecas do 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*"]
}
]
}
E as seguintes dependências do projeto:
vcpkg.json
{
"dependencies": [
"qt5",
"qt-advanced-docking-system",
"qtkeychain"
]
}
O "qt*"
padrão corresponde a todos os nomes de porta no vcpkg.json
. Mas há um problema! As portas qt-advanced-docking-system
e qtkeychain
não fazem parte das bibliotecas oficiais do Qt Framework e como vcpkg não será capaz de encontrar as portas no registro personalizado, a instalação falhará.
Isso pode ser corrigido atribuindo esses pacotes ao registro padrão.
Fazemos isso alterando a maneira como declaramos o registro padrão e adicionando qt-advanced-docking-system
e qtkeychain
à sua "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*"]
}
]
}
Porque as correspondências exatas são preferidas em relação às correspondências de padrão e qtkeychain
serão resolvidas qt-advanced-docking-system
para o registro padrão.
Sobreposições
As sobreposições são uma maneira de estender o vcpkg com portas adicionais e trigêmeos adicionais, sem criar um registro completo. As sobreposições são consideradas antes de executar qualquer pesquisa de registro ou controle de versão e substituirão quaisquer trigêmeos ou portas internos. Consulte portas de sobreposição para saber mais.
As configurações de sobreposição são avaliadas nesta ordem:
- Sobreposições da linha de comando na ordem passada;
- Sobreposições de
vcpkg-configuration.json
em ordem; então - Sobreposições das
VCPKG_OVERLAY_[PORTS|TRIPLETS]
variáveis de ambiente em ordem.
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de