Ler em inglês

Compartilhar via


Tutorial: Instalar uma versão específica das bibliotecas do Boost usando linhas de base do Registro

vcpkg fornece o Boost conjunto de bibliotecas como pacotes individuais como uma conveniência para usuários que dependem apenas de um subconjunto limitado de pacotes Boost. No entanto, essa abordagem tem uma compensação. Os usuários que desejam bloquear uma versão específica de suas dependências do Boost devem substituir as versões de cada pacote do Boost do qual dependem.

No entanto, há uma solução simples para esse problema usando linhas de base do Registro e padrões de pacote.

Pré-requisitos

  • Um terminal
  • Um compilador C++
  • vcpkg

O problema

Vamos supor que você tenha um projeto que depende e boost-optional deseja bloquear a versão 1.80.0 das bibliotecas do Boost. Portanto, você cria uma substituição para sua dependência, conforme mostrado abaixo:

vcpkg.json

{
    "dependencies": [ "boost-optional" ],
    "overrides": [
        { "name": "boost-optional", "version": "1.80.0" }
    ]
}

vcpkg-configuration.json

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

Ao executar vcpkg installo , você notará que apenas a versão de foi bloqueada1.80.0, enquanto as outras dependências do boost-optional Boost estão usando a versão de linha de base (1.83.0).

Fetching registry information from https://github.com/Microsoft/vcpkg (HEAD)...
Detecting compiler hash for triplet x64-linux...
The following packages will be built and installed:
  * boost-assert:x64-linux -> 1.83.0
  * boost-config:x64-linux -> 1.83.0
  * boost-core:x64-linux -> 1.83.0
  * boost-detail:x64-linux -> 1.83.0
  * boost-io:x64-linux -> 1.83.0
  * boost-move:x64-linux -> 1.83.0
    boost-optional:x64-linux -> 1.80.0
  * boost-predef:x64-linux -> 1.83.0
  * boost-preprocessor:x64-linux -> 1.83.0
  * boost-static-assert:x64-linux -> 1.83.0
  * boost-throw-exception:x64-linux -> 1.83.0
  * boost-type-traits:x64-linux -> 1.83.0
  * boost-uninstall:x64-linux -> 1.83.0
  * boost-utility:x64-linux -> 1.83.0
  * boost-vcpkg-helpers:x64-linux -> 1.83.0
Additional packages (*) will be modified to complete this operation.

1 - Obtendo a linha de base da versão do Boost

Execute o seguinte comando para ver o histórico de confirmações que modificaram o banco de dados de versão do boost-optional pacote:

git log "--format=%H %cd %s" --date=short --left-only -- versions/b-/boost-optional.json

Você deverá ver uma saída semelhante à esta:

caa7579a1c48e2ca770f6ccf98cb03db95642631 2023-09-13 [boost] update to v1.83.0 (#33597)
5d3798ac7388ca66c169773e46103b14077b76a4 2023-06-06 [boost] Remove port version constraints (#31572)
501db0f17ef6df184fcdbfbe0f87cde2313b6ab1 2023-04-15 [boost-build] Fix SHA512 and add MSVC workaround. (#30884)
bedfdb774cfbe47da202169046ca15441a213f3e 2023-04-15 [Boost] Update Boost ports to 1.82#0 (#30856)
9484a57dd560b89f0a583be08af6753611c57fd5 2023-02-24 Update vcpkg-tool to 2023-02-16. (#29664)
6aa38234d08efefc55b70025cf6afc2212e78e15 2023-02-01 [boost] Fix generate ports to match the tree. (#29338)
6d41737729b170cb7d323a4fddd21607c9237636 2022-12-20 [boost] update to 1.81.0 (#28356)
5ba2b95aea2a39aa89444949c7a047af38c401c1 2022-10-18 [boost] Add version constraints (#26817)
8424da584e59e05956913bf96f87654aa3096c7e 2022-08-25 [boost] update to 1.80.0 (#26233)
96ec7fb25da25e0463446e552d59715a47c95e73 2022-04-21 [boost] update to 1.79.0 (#24210)
76d4836f3b1e027758044fdbdde91256b0f0955d 2022-01-10 [boost] update to 1.78.0 (#21928)
cc471dc0f59b7b2066d6172c2893419412327a7a 2021-09-27 [boost] update to 1.77.0 (#19556)
761c81d43335a5d5ccc2ec8ad90bd7e2cbba734e 2021-07-07 [boost] update to 1.76.0 (#17335)
68a74950d0400f5a803026d0860f49853984bf11 2021-01-21 [vcpkg] Rename `port_versions` to `versions` (#15784)

Como você pode ver, o commit para a versão 1.80.0 é listado. Na próxima etapa, você usará essa confirmação como linha de base para todos os pacotes do Boost.

2 - Use uma linha de base para substituir os pacotes Boost

Em vez de adicionar uma substituição para todas as dependências relacionadas do Boost, você pode usar uma linha de base do Registro para bloquear o conjunto de versões. Modifique seu vcpkg-configuration.json arquivo conforme mostrado abaixo:

vcpkg-configuration.json

{
  "default-registry": {
    "kind": "git",
    "repository": "https://github.com/Microsoft/vcpkg",
    "baseline": "3265c187c74914aa5569b75355badebfdbab7987"
  },
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/Microsoft/vcpkg",
      "baseline": "8424da584e59e05956913bf96f87654aa3096c7e",
      "packages": [ "boost*", "boost-*"]
    }
  ]
}

O arquivo de configuração inclui duas definições do Registro. O default-registry que aponta para o registro com curadoria vcpkg em https://github.com/Microsoft/vcpkg usar o commit mais recente no momento da redação deste artigo. E um segundo registro que também aponta para o registro com curadoria vcpkg, mas em uma linha de base anterior e é limitado a pacotes que correspondem aos boost* padrões e boost-* .

Se você executar o comando, vcpkg install deverá notar que desta vez todas as bibliotecas do Boost estão usando a versão 1.80.0.

Fetching registry information from https://github.com/Microsoft/vcpkg (HEAD)...
Detecting compiler hash for triplet x64-linux...
The following packages will be built and installed:
  * boost-assert:x64-linux -> 1.80.0
  * boost-config:x64-linux -> 1.80.0
  * boost-core:x64-linux -> 1.80.0
  * boost-detail:x64-linux -> 1.80.0
  * boost-io:x64-linux -> 1.80.0
  * boost-move:x64-linux -> 1.80.0
    boost-optional:x64-linux -> 1.80.0
  * boost-predef:x64-linux -> 1.80.0
  * boost-preprocessor:x64-linux -> 1.80.0
  * boost-static-assert:x64-linux -> 1.80.0
  * boost-throw-exception:x64-linux -> 1.80.0
  * boost-type-traits:x64-linux -> 1.80.0
  * boost-uninstall:x64-linux -> 1.80.0
  * boost-utility:x64-linux -> 1.80.0
  * boost-vcpkg-helpers:x64-linux -> 1.80.0
  * boost-winapi:x64-linux -> 1.80.0
Additional packages (*) will be modified to complete this operation.

A mesma abordagem pode ser usada para outros metapacotes como qt.

Próximas etapas

Aqui estão algumas tarefas adicionais para tentar a seguir: