Delen via


Zelfstudie: Een specifieke versie van een pakket installeren

Belangrijk

Deze functie is alleen beschikbaar in manifestmodus.

met vcpkg kunt u de exacte versies van elke afhankelijkheid in uw project beheren.

In deze zelfstudie leert u het volgende:

Voorwaarden

  • Een terminal
  • Een code-editor
  • vcpkg
  • CMake

1 - Een project maken met een manifest

Maak in een lege map de volgende projectbestanden:

Een bronbestand (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;
}

Een CMake-projectbestand (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)

Een vcpkg-manifest (vcpkg.json):

{
  "dependencies": [ "fmt", "zlib" ]
}

Bouw het project, vervang %VCPKG_ROOT% door uw vcpkg-installatiepad:

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

Voer het programma uit:

fmt version is 70103
zlib version is 1.2.11

Het is waarschijnlijk dat wanneer u het programma uitvoert, de versies van deze bibliotheken anders zijn dan de bovenstaande uitvoer. In de volgende stap laten we u zien hoe u de versies van deze afhankelijkheden kunt vergrendelen, zodat ze consistent blijven telkens wanneer u het project bouwt.

2 - Versiebeperkingen toevoegen met behulp van een basislijn

Met een versiebasislijn wordt een minimale versievloer voor alle pakketten vastgesteld. Lees de vcpkg-concepten voor meer informatie over basislijnen.

Als u de exacte versies wilt ophalen die in de vorige stap zijn gebruikt, wijzigt u de inhoud van vcpkg.json in:

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

Als u builtin-baseline instelt op een specifieke doorvoer-SHA van de vcpkg-opslagplaats, wordt vcpkg geïnstrueerd om de pakketversies bij die specifieke doorvoering te gebruiken als de minimale versie voor alle pakketten.

U kunt Git gebruiken om de versies voor die specifieke basislijn te onderzoeken:

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

De uitvoer moet er ongeveer als volgt uitzien:

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

3 - De basislijnversies bijwerken

Baselines bieden een handig mechanisme om de versies van al uw afhankelijkheden op één moment bij te werken. Voer de volgende opdracht uit om uw basislijn bij te werken:

vcpkg x-update-baseline

Met de opdracht x-update-baseline wijzigt u het manifestbestand om builtin-baseline in te stellen op de huidige Git-doorvoering van uw vcpkg-exemplaar.

U kunt de optie --add-initial-baseline gebruiken om een builtin-baseline toe te voegen aan een manifest dat er nog geen heeft.

4 - Een minimale versiebeperking toevoegen

Basisversies zijn niet de enige manier om de versie van een pakket vast te zetten. vcpkg accepteert ook minimale versiebeperkingen in de vorm van version>=.

Wijzig de inhoud van vcpkg.json in:

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

In het bovenstaande manifestbestand wordt het afhankelijkheidsobject notatie gebruikt om een minimale versiebeperking (version>=) in te stellen op fmt. Om aan de afhankelijkheden te voldoen, moet vcpkg aan twee beperkingen voldoen: één afkomstig van de basislijn en één afkomstig van de minimale versie-eis in de dependencies lijst.

  • Basislijnbeperking, "version>=": "7.1.3".
  • Beperking van de afhankelijkhedenlijst, "version>=": "10.1.1".

Bouw het project en voer het uit, vervang %VCPKG_ROOT% door uw vcpkg-installatiepad:

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

De uitvoer moet er als volgt uitzien:

fmt version is 100100
zlib version is 1.2.11

In dit geval voldoet versie 10.1.1 van fmt aan beide beperkingen. Let op hoe zlib zijn basislijnversie 1.2.11krijgt.

5 - Een specifieke versie afdwingen

In sommige gevallen wilt u mogelijk een specifieke versie van een pakket afdwingen, bijvoorbeeld:

  • Versieconflicten oplossen.
  • Versies die ouder zijn dan de basislijn vergrendelen.
  • Als u versies wilt vergrendelen die anders ongelijkbaar zijn, bijvoorbeeld: vista, xp.

Met vcpkg kunt u deze problemen oplossen door versieoverschrijvingen te gebruiken.

Wijzig de inhoud van vcpkg.json in:

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

Elk pakket dat is opgenomen in de "overrides" lijst, gebruikt de opgegeven versie en negeert alle andere versiebeperkingen. In dit voorbeeld voegt de basislijn 3426db05b996481ca31e95fff3734cf23e0f51bc een minimum versiebeperking toe aan zlib van 1.2.11, maar de overschrijvingsverklaring dwingt in plaats daarvan versie 1.2.8 af.

Bouw het project en voer het uit, vervang %VCPKG_ROOT% door uw vcpkg-installatiepad:

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

De uitvoer moet er als volgt uitzien:

fmt version is 100100
zlib version is 1.2.8

Volgende stappen

In deze zelfstudie hebt u de verschillende mechanismen geleerd die vcpkg biedt om specifieke pakketversies te vergrendelen. Lees de concepten voor versiebeheer en, en de referentie en om meer te weten te komen over hoe vcpkg versieoplossing verwerkt.

Hier volgen enkele extra taken om het volgende te proberen: