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
, fmt
i 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 Directories
i 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