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.11
de 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:
- Reutilizar binários em execuções de integração contínua usando cache binário
- Gerenciar suas bibliotecas particulares usando registros personalizados