Sdílet prostřednictvím


Kurz: Instalace konkrétní verze balíčku

Důležitý

Tato funkce je dostupná pouze v režimu manifestu.

Vcpkg umožňuje řídit přesné verze jednotlivých závislostí v projektu.

V tomto kurzu se naučíte:

Požadavky

  • Terminál
  • Editor kódu
  • vcpkg
  • CMake

1. Vytvoření projektu s manifestem

V prázdné složce vytvořte následující soubory projektu:

Zdrojový soubor (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;
}

Soubor 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" ]
}

Sestavte projekt a nahraďte %VCPKG_ROOT% instalační cestou vcpkg:

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

Spusťte program:

fmt version is 70103
zlib version is 1.2.11

Je pravděpodobné, že když spustíte program, verze těchto knihoven se liší od výstupu výše. V dalším kroku vám ukážeme, jak uzamknout verze těchto závislostí, aby byly konzistentní při každém sestavení projektu.

2. Přidejte omezení verzí pomocí výchozí hodnoty

Směrný plán verze stanoví minimální úroveň verze pro všechny balíčky. Přečtěte si koncepty vcpkg, abyste se dozvěděli o základních liniích.

Pokud chcete získat přesné verze použité v předchozím kroku, upravte obsah vcpkg.json na:

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

Nastavení builtin-baseline na konkrétní commit SHA úložiště vcpkg dává vcpkg pokyn, aby používal verze balíčků z tohoto konkrétního potvrzení jako minimální verze pro všechny balíčky.

Pomocí Gitu můžete prozkoumat verze pro konkrétní směrný plán:

git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3

Výstup by měl vypadat nějak takto:

    "fmt": {
      "baseline": "7.1.3",
      "port-version": 1
    },
--
    "zlib": {
      "baseline": "1.2.11",
      "port-version": 9
    },

3. Aktualizace standardních verzí

Standardní hodnoty nabízejí pohodlný mechanismus pro aktualizaci verzí všech závislostí najednou. Pokud chcete aktualizovat základní hodnoty, spusťte následující příkaz:

vcpkg x-update-baseline

Příkaz x-update-baseline upraví soubor manifestu tak, aby nastavil builtin-baseline na aktuální potvrzení Gitu vaší instance vcpkg.

Možnost --add-initial-baseline můžete použít k přidání builtin-baseline do manifestu, který ho ještě nemá.

4. Přidání omezení minimální verze

Standardní hodnoty nejsou jediným způsobem, jak uzamknout verzi balíčku. vcpkg také přijímá minimální omezení verze ve formě version>=.

Upravte obsah vcpkg.json na:

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

Výše uvedený soubor manifestu používá notaci objektu závislosti k nastavení požadavku minimální verze (version>=) na fmt. Aby vcpkg mohl splnit závislosti, je nutné splnit dvě omezení: jedno pocházející ze základní linie a druhé z omezení minimální verze v seznamu dependencies.

  • Omezení základní linie, "version>=": "7.1.3".
  • Omezení seznamu závislostí, "version>=": "10.1.1".

Sestavte a spusťte projekt, nahraďte %VCPKG_ROOT% instalační cestou vcpkg:

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

Výstup by měl vypadat takto:

fmt version is 100100
zlib version is 1.2.11

V tomto případě verze 10.1.1 pro fmt splňuje obě omezení. Všimněte si, jak zlib získá základní verzi 1.2.11.

5. Vynucení konkrétní verze

V některých případech můžete chtít vynutit konkrétní verzi balíčku, například:

  • Pokud chcete vyřešit konflikty verzí.
  • Uzamčení verzí starších než standardních hodnot
  • Uzamčení verzí, které jsou jinak nesrovnatelné, například: vista, xp.

S vcpkg můžete tyto problémy vyřešit pomocí předefinování verzí.

Upravte obsah vcpkg.json na:

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

Všechny balíčky zahrnuté v seznamu "overrides" budou používat zadanou verzi a zároveň budou ignorovat všechna ostatní omezení verzí. V tomto příkladu základní omezení 3426db05b996481ca31e95fff3734cf23e0f51bc přidává omezení minimální verze na zlib z 1.2.11, ale deklarace přepsání přinutí použít verzi 1.2.8.

Sestavte a spusťte projekt, nahraďte %VCPKG_ROOT% instalační cestou vcpkg:

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

Výstup by měl vypadat takto:

fmt version is 100100
zlib version is 1.2.8

Další kroky

V tomto kurzu jste se seznámili s různými mechanismy, které vcpkg nabízí k uzamčení konkrétních verzí balíčků. Přečtěte si koncepty správy verzí a referenční, kde najdete další informace o tom, jak vcpkg zpracovává řešení verzí.

Tady je několik dalších úkolů, které můžete vyzkoušet:

  • Opakované použití binárních souborů při spuštěních kontinuální integrace díky využití binární mezipaměti
  • Správa privátních knihoven pomocí vlastních registrů