Compartilhar via


Resolução de nome de pacote

O 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 nullfor , 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, o vcpkg prioriza da seguinte forma:

  1. A correspondência -- boost exata é escolhida em vez de boost*
  2. O padrão -- boost* mais longo é escolhido em vez de b*
  3. Primeira correspondência -- O primeiro registro declarando o melhor padrão é escolhido

Exemplo #1: resolução de nome de pacote

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 essa configuração, cada nome de pacote é resolvido para:

  • beicode: do registro https://github.com/vicroms/vcpkg-registry (correspondência exata em beicode)
  • beison: do registro https://github.com/Microsoft/vcpkg-docs (correspondência de padrão ativada beison e declarada pela primeira vez na "registries" matriz)
  • fmt: do registro padrão (sem correspondências)

Como vários registros declaram bei*, o 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/microsoft/vcpkg-docs
    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 to "default-registry" null e usando o "*" "registries" padrão na 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 ao array packages, enquanto o "default-registry" objeto não permite que você defina um array packages. Essa diferença se torna importante nos casos em que você precisa garantir que um pacote venha 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 em 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 o 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. Conseguimos isso alterando a maneira como declaramos o registro padrão e adicionando qt-advanced-docking-system e qtkeychain ao seu "packages" array:

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 preferenciais em relação às correspondências qt-advanced-docking-system de padrão e qtkeychain serão resolvidas para o registro padrão.

Portas de sobreposição

As portas de sobreposição são uma maneira de estender o vcpkg com portas adicionais sem criar um registro completo. As sobreposições são consideradas antes de qualquer pesquisa de registro ou considerações de controle de versão. As sobreposições substituem quaisquer trigêmeos ou portas integrados. Consulte portas de sobreposição para saber mais.

As portas de sobreposição são avaliadas nesta ordem:

  1. Sobreposições da linha --overlay-ports de comando na ordem passada; em seguida,
  2. Sobreposições de vcpkg-configuration.json"overlay-ports" em ordem; então
  3. Sobreposições da VCPKG_OVERLAY_PORTS variável de ambiente em ordem.

Trigêmeos de sobreposição

Os trigêmeos de sobreposição são uma maneira de estender o vcpkg com trigêmeos adicionais, sem modificar o diretório de instalação do vcpkg. As sobreposições são consideradas antes de qualquer trigêmeo integrado.

Os trigêmeos de sobreposição são avaliados nesta ordem:

  1. Sobreposições da linha de comando na ordem passada; em seguida,
  2. Sobreposições de vcpkg-configuration.json em ordem; então
  3. Sobreposições da VCPKG_OVERLAY_TRIPLETS variável de ambiente em ordem.