Compartilhar via


Tutorial: Instalar uma versão específica de um pacote

Importante

Esse recurso está disponível apenas no modo de manifesto .

vcpkg permite controlar as versões precisas de cada dependência em seu projeto.

Neste tutorial, você aprenderá a:

Pré-requisitos

  • Um terminal
  • Um editor de código
  • vcpkg
  • CMake

1 – Criar um projeto com um manifesto

Em uma pasta vazia, crie os seguintes arquivos de projeto:

Um arquivo de origem (main.cpp):

#include <fmt/core.h>
#include <zlib.h>

int main()
{
    fmt::print("fmt version is {}\n"
               "zlib version is {}\n", 
               FMT_VERSION, ZLIB_VERSION);
    return 0;
}

Um arquivo de projeto do CMake (CMakeLists.txt):

cmake_minimum_required(VERSION 3.18)

project(versionstest CXX)

add_executable(main main.cpp)

find_package(ZLIB REQUIRED)
find_package(fmt CONFIG REQUIRED)
target_link_libraries(main PRIVATE ZLIB::ZLIB fmt::fmt)

O manifesto do vcpkg (vcpkg.json):

{
  "dependencies": [ "fmt", "zlib" ]
}

Crie o projeto, substitua %VCPKG_ROOT% pelo caminho de instalação do seu vcpkg:

cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build

Execute o programa:

fmt version is 70103
zlib version is 1.2.11

É provável que, quando você executa o programa, as versões dessas bibliotecas sejam diferentes da saída acima. Na próxima etapa, mostramos como bloquear as versões dessas dependências para que elas permaneçam consistentes sempre que você compilar o projeto.

2 – Adicionar restrições de versão usando uma linha de base

Uma linha de base de versão estabelece um piso de versão mínimo para todos os pacotes. Leia os conceitos do vcpkg para saber mais sobre linhas de base.

Para obter as versões exatas usadas na etapa anterior, modifique o conteúdo do vcpkg.json para:

{
  "dependencies": [
    "fmt",
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}

A configuração builtin-baseline para um SHA de commit específico do repositório vcpkg instrui o vcpkg a usar as versões do pacote nessa confirmação específica como a versão mínima para todos os pacotes.

Você pode usar o Git para examinar as versões dessa linha de base específica:

git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3

A saída deve ser semelhante a esta:

    "fmt": {
      "baseline": "7.1.3",
      "port-version": 1
    },
--
    "zlib": {
      "baseline": "1.2.11",
      "port-version": 9
    },

3 – Atualizar as versões de linha de base

As linhas de base oferecem um mecanismo conveniente para atualizar as versões de todas as suas dependências ao mesmo tempo. Para atualizar sua linha de base, execute o seguinte comando:

vcpkg x-update-baseline

O comando x-update-baseline modifica o arquivo de manifesto para definir builtin-baseline para a confirmação Git atual da instância vcpkg.

Você pode usar a opção --add-initial-baseline para adicionar um builtin-baseline a um manifesto que ainda não tem um.

4 – Adicionar uma restrição de versão mínima

As linhas de base não são a única maneira de bloquear a versão de um pacote. vcpkg também aceita restrições mínimas de versão na forma de version>=.

Modifique o conteúdo de vcpkg.json para:

{
  "dependencies": [
    {
        "name": "fmt",
        "version>=": "10.1.1"
    },
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}

O arquivo de manifesto acima usa a notação do objeto de dependência para definir uma restrição de versão mínima (version>=) em fmt. Para atender às dependências, o vcpkg precisa atender a duas restrições, uma proveniente da linha de base e outra proveniente da restrição de versão mínima na lista de dependencies.

  • Restrição de linha de base, "version>=": "7.1.3".
  • Restrição de lista de dependências, "version>=": "10.1.1".

Crie e execute o projeto, substitua %VCPKG_ROOT% pelo caminho de instalação do vcpkg:

rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main

A saída deve ter esta aparência:

fmt version is 100100
zlib version is 1.2.11

Nesse caso, a versão 10.1.1 de fmt atende às duas restrições. Observe como zlib recebe sua versão de base 1.2.11.

5 – Forçar uma versão específica

Em alguns casos, talvez você queira forçar uma versão específica de um pacote, por exemplo:

  • Para resolver conflitos de versão.
  • Para bloquear versões mais antigas que a linha de base.
  • Para bloquear versões que de outro modo são incomparáveis, por exemplo: vista, xp.

vcpkg permite que você resolva esses problemas usando substituições de versão.

Modifique o conteúdo do vcpkg.json para:

{
  "dependencies": [
    {
        "name": "fmt",
        "version>=": "10.1.1"
    },
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc", 
  "overrides": [
    { 
        "name": "zlib", 
        "version": "1.2.8"
    }
  ]
}

Qualquer pacote incluído na lista "overrides" usará a versão especificada, ignorando todas as outras restrições de versão. Neste exemplo, a linha de base 3426db05b996481ca31e95fff3734cf23e0f51bc adiciona uma restrição de versão mínima à zlib de 1.2.11, mas a declaração de substituição impõe o uso da versão 1.2.8.

Crie e execute o projeto, substitua "%VCPKG_ROOT%" pelo caminho de instalação real do vcpkg:

rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main

A saída deve ter esta aparência:

fmt version is 100100
zlib version is 1.2.8

Próximas etapas

Neste tutorial, você aprendeu os diferentes mecanismos que o vcpkg oferece para bloquear versões de pacote específicas. Leia os conceitos e a referência de controle de versão para saber mais sobre como o vcpkg lida com a resolução de versão.

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