Samouczek: instalowanie określonej wersji pakietu
Narzędzie vcpkg umożliwia kontrolowanie dokładnych wersji każdej zależności w projekcie.
Z tego samouczka dowiesz się, jak wykonywać następujące elementy:
Warunki wstępne
- Terminal
- Edytor kodu
- vcpkg
- CMake
1 — Tworzenie projektu za pomocą manifestu
W pustym folderze utwórz następujące pliki projektu:
Plik źródłowy (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;
}
Plik projektu 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)
Manifest vcpkg (vcpkg.json
):
{
"dependencies": [ "fmt", "zlib" ]
}
Skompiluj projekt, zastąp %VCPKG_ROOT%
ścieżką instalacji programu vcpkg:
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
Uruchom program:
fmt version is 70103
zlib version is 1.2.11
Prawdopodobnie po uruchomieniu programu wersje tych bibliotek różnią się od powyższych danych wyjściowych. W następnym kroku pokażemy, jak zablokować wersje tych zależności, aby były spójne za każdym razem, gdy kompilujesz projekt.
2 — Dodawanie ograniczeń wersji przy użyciu punktu odniesienia
Podstawa wersji określa minimalną wymaganą wersję dla wszystkich pakietów. Przeczytaj pojęcia dotyczące narzędzia vcpkg, aby dowiedzieć się o podstawach.
Aby uzyskać dokładne wersje używane w poprzednim kroku, zmodyfikuj zawartość vcpkg.json
na:
{
"dependencies": [
"fmt",
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
Ustawienie builtin-baseline
do określonego SHA zatwierdzenia w repozytorium vcpkg poleca vcpkg użycie wersji pakietów z tego konkretnego zatwierdzenia jako minimalnej wersji dla wszystkich pakietów.
Za pomocą usługi Git można sprawdzić wersje dla tego konkretnego punktu odniesienia:
git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3
Dane wyjściowe powinny wyglądać mniej więcej tak:
"fmt": {
"baseline": "7.1.3",
"port-version": 1
},
--
"zlib": {
"baseline": "1.2.11",
"port-version": 9
},
3 — Aktualizowanie wersji punktu odniesienia
Punkty odniesienia zapewniają wygodny mechanizm aktualizacji wersji wszystkich zależności jednocześnie. Aby zaktualizować punkt odniesienia, uruchom następujące polecenie:
vcpkg x-update-baseline
Polecenie x-update-baseline
modyfikuje plik manifestu, aby ustawić builtin-baseline
na bieżący commit Git instancji vcpkg.
Możesz użyć opcji --add-initial-baseline
, aby dodać builtin-baseline
do manifestu, który jeszcze go nie ma.
4 — Dodawanie ograniczenia minimalnej wersji
Ustawienia bazowe nie są jedynym sposobem zablokowania wersji pakietu. Program vcpkg akceptuje również minimalne ograniczenia wersji w postaci version>=
.
Zmodyfikuj zawartość vcpkg.json
na:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
Powyższy plik manifestu używa notacji obiektu zależności, aby ustawić ograniczenie wersji minimalnej (version>=
) na fmt
. Aby spełnić wymagania zależności, vcpkg musi spełnić dwa ograniczenia, jeden pochodzący z punktu odniesienia i jeden pochodzący z ograniczenia wersji minimalnej na liście dependencies
.
- Ograniczenie linii bazowej,
"version>=": "7.1.3"
. - Ograniczenie listy zależności
"version>=": "10.1.1"
.
Skompiluj i uruchom projekt, zastąp %VCPKG_ROOT%
ścieżką instalacji programu vcpkg:
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main
Dane wyjściowe powinny wyglądać następująco:
fmt version is 100100
zlib version is 1.2.11
W tym przypadku wersja 10.1.1
fmt
spełnia oba ograniczenia. Zwróć uwagę, że zlib
otrzymuje swoją wersję bazową 1.2.11
.
5 — Wymuszanie określonej wersji
W niektórych przypadkach możesz wymusić określoną wersję pakietu, na przykład:
- Aby rozwiązać konflikty wersji.
- Aby zablokować wersje starsze niż wersja bazowa.
- Aby zablokować wersje, które w przeciwnym razie są nieporównywalne, na przykład:
vista
,xp
.
Narzędzie vcpkg umożliwia rozwiązanie tych problemów przy użyciu przesłonięć wersji.
Zmodyfikuj zawartość vcpkg.json
na:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "zlib",
"version": "1.2.8"
}
]
}
Każdy pakiet uwzględniony na liście "overrides"
będzie używać określonej wersji, ignorując wszystkie inne ograniczenia wersji. W tym przykładzie baza odniesienia 3426db05b996481ca31e95fff3734cf23e0f51bc
dodaje ograniczenie minimalnej wersji 1.2.11
dla zlib
, ale deklaracja zastąpienia wymusza zamiast tego wersję 1.2.8
.
Skompiluj i uruchom projekt, zastąp %VCPKG_ROOT%
ścieżką instalacji programu vcpkg:
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main
Dane wyjściowe powinny wyglądać następująco:
fmt version is 100100
zlib version is 1.2.8
Następne kroki
W tym samouczku przedstawiono różne mechanizmy, które oferuje vcpkg, aby zablokować określone wersje pakietów. Aby dowiedzieć się więcej na temat sposobu, w jaki narzędzie vcpkg obsługuje rozwiązywanie wersji, przeczytaj pojęcia dotyczące wersjonowania i oraz odniesienia i.
Poniżej przedstawiono kilka dodatkowych zadań, które należy wykonać, aby spróbować wykonać następne czynności:
- Powtórne użycie plików binarnych w ramach procesów ciągłej integracji przy użyciu buforowania binarnego
- Zarządzaj bibliotekami prywatnymi przy użyciu rejestrów niestandardowych