Samouczek: instalowanie zależności z pliku manifestu

Vcpkg ma dwa tryby operacji: tryb klasyczny i tryb manifestu. W tym artykule opisano sposób instalowania pakietów przy użyciu trybu manifestu, który jest zalecanym przepływem pracy dla większości użytkowników.

W trybie manifestu deklarujesz bezpośrednie zależności projektu w pliku manifestu o nazwie vcpkg.json.

Pliki manifestu mają własny vcpkg_installed katalog, w którym instalują zależności, w przeciwieństwie do trybu klasycznego, w którym wszystkie pakiety są instalowane w wspólnym %VCPKG_ROOT%/installed katalogu. W związku z tym każdy projekt może mieć własny manifest i własny zestaw zależności, które nie powodują konfliktu z zależnościami innych projektów.

Tryb manifestu jest również wymagany do korzystania z zaawansowanych funkcji, takich jak przechowywanie wersji i niestandardowe rejestry.

Niniejszy samouczek zawiera informacje na temat wykonywania następujących czynności:

Wymagania wstępne

  • vcpkg
  • Terminal
  • Edytor kodu
  • Kompilator języka C++
  • (Opcjonalnie) CMake lub MSBuild

1 — Tworzenie projektu za pomocą manifestu

W nowym folderze utwórz plik źródłowy o nazwie o main.cxx następującej zawartości:

#include <cxxopts.hpp>
#include <fmt/format.h>
#include <range/v3/view.hpp>

namespace view = ranges::views;

int fib(int x)
{
  int a = 0, b = 1;

  for (int it : view::repeat(0) | view::take(x))
  {
    (void)it;
    int tmp = a;
    a += b;
    b = tmp;
  }

  return a;
}

int main(int argc, char **argv)
{
  cxxopts::Options options("fibo", "Print the fibonacci sequence up to a value 'n'");
  options.add_options()("n,value", "The value to print to", cxxopts::value<int>()->default_value("10"));

  auto result = options.parse(argc, argv);
  auto n = result["value"].as<int>();

  for (int x : view::iota(1) | view::take(n))
  {
    fmt::print("fib({}) = {}\n", x, fib(x));
  }
}

Kod odwołuje się do bibliotek open source: cxxopts, fmti range-v3; które są dostępne w publicznym rejestrze vcpkg pod adresem https://github.com/Microsoft/vcpkg.

Aby zadeklarować te zależności, utwórz plik o nazwie vcpkg.json w tym samym katalogu co projekt:

vcpkg.json:

{
  "dependencies": [
    "cxxopts",
    "fmt",
    "range-v3"
  ]
}

Wystarczy określić bezpośrednie zależności na "dependencies" liście. Po uruchomieniu program vcpkg rozpoznaje i instaluje wszelkie wymagane zależności przechodnie.

2 — Integrowanie narzędzia vcpkg z systemem kompilacji

W tym kroku pokazano, jak zintegrować narzędzie vcpkg z narzędziem CMake lub MSBuild, dzięki czemu zależności projektu będą automatycznie instalowane lub przywracane podczas kompilowania projektu.

Jeśli używasz innego systemu kompilacji, przejdź do następnego kroku: Instalowanie zależności.

Aby użyć narzędzia vcpkg w projektach MSBuild, uruchom następujące polecenie:

vcpkg integrate install

Wystarczy uruchomić polecenie przy pierwszym włączeniu vcpkg integrate install integracji z programem MSBuild. Umożliwia to integrację programu MSBuild ze wszystkimi istniejącymi i przyszłymi projektami. Użyj vcpkg integrate remove polecenia , aby usunąć integrację w całym systemie MSBuild.

Ta metoda integracji automatycznie dodaje pakiety zainstalowane przez program vcpkg do następujących właściwości projektu: Include Directories, Link Directoriesi Link Libraries. Ponadto spowoduje to utworzenie akcji po kompilacji, która gwarantuje, że wszystkie wymagane biblioteki DLL zostaną skopiowane do folderu wyjściowego kompilacji. Działa to w przypadku wszystkich rozwiązań i projektów korzystających z programu Visual Studio 2015 lub nowszego.

3 — Instalowanie zależności

Jeśli używasz narzędzia CMake lub MSBuild i wykonano poprzedni krok, możesz przejść do następnego kroku: Skompiluj projekt.

Jeśli używasz innego systemu kompilacji lub chcesz ręcznie zainstalować zależności, wszystko, co musisz zrobić, to uruchomić vcpkg install w katalogu zawierającym plik manifestu.

PS D:\projects\manifest-example> vcpkg install
Detecting compiler hash for triplet x64-windows...
The following packages will be built and installed:
    cxxopts:x64-windows -> 3.1.1
    fmt:x64-windows -> 10.0.0
    range-v3:x64-windows -> 0.12.0#1
  * vcpkg-cmake:x64-windows -> 2023-05-04
  * vcpkg-cmake-config:x64-windows -> 2022-02-06#1
Additional packages (*) will be modified to complete this operation.
Installing 1/5 vcpkg-cmake-config:x64-windows...
Installing 2/5 vcpkg-cmake:x64-windows...
Installing 3/5 cxxopts:x64-windows...
Installing 4/5 fmt:x64-windows...
Installing 5/5 range-v3:x64-windows...
Total install time: 48 s
cxxopts provides CMake targets:

    # this is heuristically generated, and may not be correct
    find_package(cxxopts CONFIG REQUIRED)
    target_link_libraries(main PRIVATE cxxopts::cxxopts)

The package fmt provides CMake targets:

    find_package(fmt CONFIG REQUIRED)
    target_link_libraries(main PRIVATE fmt::fmt)

    # Or use the header-only version
    find_package(fmt CONFIG REQUIRED)
    target_link_libraries(main PRIVATE fmt::fmt-header-only)

range-v3 provides CMake targets:

    # this is heuristically generated, and may not be correct
    find_package(range-v3 CONFIG REQUIRED)
    target_link_libraries(main PRIVATE range-v3::meta range-v3::concepts range-v3::range-v3)

Po zakończeniu polecenia wszystkie skompilowane pakiety będą obecne w vcpkg_installed katalogu. Określona lokalizacja tego katalogu zależy od systemu kompilacji; zazwyczaj wewnątrz domyślnego folderu wyjściowego systemu kompilacji lub obok vcpkg.json pliku.

4 — Kompilowanie projektu

Domyślnie tryb manifestu jest wyłączony w projektach MSBuild.

Aby włączyć manifesty w projekcie, ustaw VcpkgEnableManifest właściwość w .vcxproj pliku:

<PropertyGroup Label="Vcpkg">
  <VcpkgEnableManifest>true</VcpkgEnableManifest>
</PropertyGroup>

Alternatywnie możesz włączyć tryb manifestu w wywołaniu MSBuild, przekazując msbuild /p:VcpkgEnableManifest=true jako parametr.

PS D:\projects\manifest-example> msbuild /p:VcpkgEnableManifest=true
MSBuild version 17.7.0-preview-23319-02+6829506b8 for .NET Framework
Build started 8/11/2023 11:29:50 AM.

Project "D:\projects\manifest-example\manifest-example.sln" on node 1 (default targets).
ValidateSolutionConfiguration:
  Building solution configuration "Debug|x64".
Project "D:\projects\manifest-example\manifest-example.sln" (1) is building "D:\projects\manifest-example\manifest-example.vcxproj" (2) on node 1 (default targets).
PrepareForBuild:
  (omitted)
InitializeBuildStatus:
  (omitted)
ComputeStdModulesCompileInputs:
  (omitted)
SetModuleDependencies:
  Creating directory "x64\Debug\manifest.ceffc6eb_MD.tlog\".
VcpkgTripletSelection:
  Using triplet "x64-windows" from "D:\projects\manifest-example\vcpkg_installed\x64-windows\x64-windows\"
  Using normalized configuration "Debug"
VcpkgInstallManifestDependencies:
  Installing vcpkg dependencies to D:\projects\manifest-example\vcpkg_installed\x64-windows\
  Creating directory "D:\projects\manifest-example\vcpkg_installed\x64-windows\".
  "D:\vcpkg\vcpkg.exe" install  --x-wait-for-lock --triplet "x64-windows" --vcpkg-root "D:\vcpkg\" "--x-manifest-root=D:\projects\manifest-example\" "--x-install-root=D:\projects\manifest-example\vcpkg_installed\x64-windows\"
  "D:\vcpkg\vcpkg.exe" install  --x-wait-for-lock --triplet "x64-windows" --vcpkg-root "D:\vcpkg\" "--x-manifest-root=D:\projects\manifest-example\" "--x-install-root=D:\projects\manifest-example\vcpkg_installed\x64-windows\"
  Detecting compiler hash for triplet x64-windows...
  The following packages will be built and installed:
      cxxopts:x64-windows -> 3.1.1
      fmt:x64-windows -> 10.0.0
      range-v3:x64-windows -> 0.12.0#1
    * vcpkg-cmake:x64-windows -> 2023-05-04
    * vcpkg-cmake-config:x64-windows -> 2022-02-06#1
  (omitted)
ClCompile:
  (omitted)
Link:
  (omitted)
AppLocalFromInstalled:
  pwsh.exe -ExecutionPolicy Bypass -noprofile -File "D:\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "D:\projects\manif
  est-mode-msbuild\x64\Debug\manifest-example.exe" "D:\projects\manifest-example\vcpkg_installed\x64-windows\x64-windows\debug\bin"
  "x64\Debug\manifest.ceffc6eb.tlog\manifest-example.write.1u.tlog" "x64\Debug\vcpkg.applocal.log"
  D:\projects\manifest-example\x64\Debug\fmtd.dll
FinalizeBuildStatus:
  (omitted)
Done Building Project "D:\projects\manifest-example\manifest-example.vcxproj" (default targets).

Done Building Project "D:\projects\manifest-example\manifest-example.sln" (default targets).

Build succeeded.

Następne kroki

W tym przewodniku zainstalowano zależności dla prostego projektu przy użyciu pliku manifestu.

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

  • Instalowanie pakietów dla niestandardowych platform, kompilatorów lub architektur kompilacji przy użyciu trypletów
  • Blokowanie wersji dla powtarzalnych kompilacji przy użyciu przechowywania wersji
  • Ponowne używanie plików binarnych w ramach uruchamiania integracji lokalnej lub ciągłej przy użyciu buforowania binarnego
  • Zarządzanie bibliotekami prywatnymi przy użyciu rejestrów niestandardowych