Tutorial: Instalar uma versão específica de um pacote
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:
- Reutilizar binários em execuções de Integração Contínua usando o cache binário
- Gerenciar suas bibliotecas privadas usando registros personalizados