Compartilhar via


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

Importante

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

VCPKG permite que você controle 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 - Crie 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 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)

Um manifesto vcpkg (vcpkg.json):

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

Construa o projeto, substitua %VCPKG_ROOT% pelo caminho de instalação 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 são diferentes da saída acima. Na próxima etapa, mostraremos 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 vcpkg para aprender sobre linhas de base.

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

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

A configuração builtin-baseline para um SHA de confirmação 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 deverá ser semelhante ao seguinte:

    "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 de uma só vez. Para atualizar a linha de base, execute o seguinte comando:

vcpkg x-update-baseline

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

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

4 - Adicione 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 de versão mínima na forma de version>=.

Modifique o conteúdo de vcpkg.json :

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

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

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

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

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

O resultado deve ser assim:

fmt version is 100100
zlib version is 1.2.11

Nesse caso, a versão 10.1.1 do fmt satisfaz ambas as restrições. Observe como zlib obtém sua versão 1.2.11de linha de base.

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

Em alguns casos, convém forçar uma versão específica de um pacote, por exemplo:

  • Para resolver conflitos de versão.
  • Para bloquear versões anteriores à linha de base.
  • Para bloquear versões que são incomparáveis, por exemplo: vista, xp.

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

Modifique o vcpkg.json conteúdo 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 usará a "overrides" versão especificada enquanto ignora todas as outras restrições de versão. Neste exemplo, a linha de base 3426db05b996481ca31e95fff3734cf23e0f51bc adiciona uma restrição de versão mínima em zlib de mas a declaração de 1.2.11 substituição força a versão 1.2.8 .

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

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

O resultado deve ser assim:

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 específicas de pacotes. 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 em seguida: