Samouczek: instalowanie określonej wersji pakietu

Ważne

Ta funkcja jest dostępna tylko w trybie manifestu.

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:

Wymagania 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% ciąg ścieżką instalacji narzędzia 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

Punkt odniesienia wersji ustanawia minimalną podłogę wersji dla wszystkich pakietów. Zapoznaj się z pojęciami dotyczącymi narzędzia vcpkg, aby dowiedzieć się więcej o punktach odniesienia.

Aby uzyskać dokładne wersje używane w poprzednim kroku, zmodyfikuj zawartość vcpkg.json elementu na:

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

Ustawienie builtin-baseline określonego zatwierdzenia SHA repozytorium vcpkg instruuje vcpkg do używania wersji pakietu w tym konkretnym zatwierdzeniu 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

Linie bazowe oferują 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 bieżące zatwierdzenie usługi Git wystąpienia programu vcpkg.

Możesz użyć --add-initial-baseline opcji , aby dodać element builtin-baseline do manifestu, który jeszcze go nie ma.

4 — Dodawanie ograniczenia minimalnej wersji

Punkty odniesienia nie są jedynym sposobem zablokowania wersji pakietu. Narzędzie vcpkg akceptuje również minimalne ograniczenia wersji w postaci version>=.

Zmodyfikuj zawartość elementu 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 minimalnej wersji (version>=) na .fmt Aby spełnić wymagania zależności, vcpkg musi spełniać dwa ograniczenia, jeden pochodzący z punktu odniesienia i jeden pochodzący z ograniczenia wersji minimalnej na dependencies liście.

  • Ograniczenie linii bazowej, "version>=": "7.1.3".
  • Ograniczenie listy zależności, "version>=": "10.1.1".

Skompiluj i uruchom projekt, zastąp ciąg %VCPKG_ROOT% ścieżką instalacji narzędzia 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ć podobnie do poniższych:

fmt version is 100100
zlib version is 1.2.11

W takim przypadku wersja 10.1.1fmt elementu spełnia oba ograniczenia. Zwróć uwagę, jak zlib pobiera wersję 1.2.11punktu odniesienia .

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ż punkt odniesienia.
  • Aby zablokować wersje, które w przeciwnym razie są niekomputeralne, na przykład: vista, xp.

Narzędzie vcpkg umożliwia rozwiązanie tych problemów przy użyciu przesłonięć wersji.

Zmodyfikuj zawartość na vcpkg.json :

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

Każdy pakiet uwzględniony na "overrides" liście będzie używać określonej wersji, ignorując wszystkie inne ograniczenia wersji. W tym przykładzie punkt odniesienia 3426db05b996481ca31e95fff3734cf23e0f51bc dodaje ograniczenie minimalnej wersji, zlib1.2.11 ale zamiast tego deklaracja zastąpienia wymusza wersję 1.2.8 .

Skompiluj i uruchom projekt, zastąp ciąg %VCPKG_ROOT% ścieżką instalacji narzędzia 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ć podobnie do poniższych:

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. Zapoznaj się z pojęciami dotyczącymi przechowywania wersji i dokumentacją, aby dowiedzieć się więcej na temat sposobu obsługi rozpoznawania wersji przez narzędzie vcpkg.

Poniżej przedstawiono kilka dodatkowych zadań, które należy wykonać, aby spróbować wykonać następne czynności: