Zelfstudie: Een afhankelijkheid installeren vanuit een manifestbestand
vcpkg heeft twee bewerkingsmodi: klassieke modus en manifestmodus. In dit artikel wordt beschreven hoe u pakketten installeert met behulp van de manifestmodus. Dit is de aanbevolen werkstroom voor de meeste gebruikers.
In de manifestmodus declareert u de directe afhankelijkheden van uw project in een manifestbestand met de naam vcpkg.json
.
Manifestbestanden hebben hun eigen vcpkg_installed
map waar ze afhankelijkheden installeren, in tegenstelling tot de klassieke modus, waarbij alle pakketten worden geïnstalleerd in een gemeenschappelijke %VCPKG_ROOT%/installed
map. Daarom kan elk project een eigen manifest en een eigen set afhankelijkheden hebben die niet conflicteren met de afhankelijkheden van andere projecten.
Manifestmodus is ook vereist voor het gebruik van geavanceerde functies zoals versiebeheer en aangepaste registers.
In deze zelfstudie leert u het volgende:
Voorwaarden
- vcpkg
- Een terminal
- Een code-editor
- Een C++-compiler
- (Optioneel) CMake of MSBuild
1 - Een project maken met een manifest
Maak in een nieuwe map een bronbestand met de naam main.cxx
met de volgende inhoud:
#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));
}
}
De code verwijst naar de opensource-bibliotheken: cxxopts
, fmt
en range-v3
; die allemaal beschikbaar zijn in het openbare vcpkg-register op https://github.com/Microsoft/vcpkg.
Als u deze afhankelijkheden wilt declareren, maakt u een bestand met de naam vcpkg.json
in dezelfde map als uw project:
vcpkg.json
:
{
"dependencies": [
"cxxopts",
"fmt",
"range-v3"
]
}
U hoeft alleen uw directe afhankelijkheden op te geven in de "dependencies"
lijst. Wanneer deze wordt uitgevoerd, worden alle vereiste transitieve afhankelijkheden door vcpkg omgezet en geïnstalleerd.
2 - Vcpkg integreren met uw buildsysteem
In deze stap laten we u zien hoe u vcpkg integreert met CMake of MSBuild, zodat uw projectafhankelijkheden automatisch worden geïnstalleerd of hersteld wanneer u het project bouwt.
Als u een ander buildsysteem gebruikt, gaat u verder met de volgende stap: Afhankelijkheden installeren.
Als u vcpkg wilt gebruiken in uw MSBuild-projecten, voert u de volgende opdracht uit:
vcpkg integrate install
U hoeft de opdracht vcpkg integrate install
alleen uit te voeren wanneer u MSBuild-integratie de eerste keer wilt inschakelen. Hierdoor is MSBuild-integratie mogelijk voor al uw bestaande en toekomstige projecten. Gebruik vcpkg integrate remove
om msBuild systeembrede integratie te verwijderen.
Met deze integratiemethode worden automatisch vcpkg-geïnstalleerde pakketten toegevoegd aan de volgende projecteigenschappen: Include Directories
, Link Directories
en Link Libraries
. Daarnaast wordt er een actie na de build gemaakt die ervoor zorgt dat alle vereiste DLL's worden gekopieerd naar de uitvoermap van de build. Dit werkt voor alle oplossingen en projecten met Visual Studio 2015 of hoger.
3 - Afhankelijkheden installeren
Als u CMake of MSBuild gebruikt en de vorige stap hebt gevolgd, kunt u verdergaan met de volgende stap: Het project bouwen.
Als u een ander buildsysteem gebruikt of de afhankelijkheden handmatig wilt installeren, hoeft u alleen maar vcpkg install
uit te voeren in de map met het manifestbestand.
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)
Wanneer de opdracht is voltooid, zijn alle ingebouwde pakketten aanwezig in een vcpkg_installed
map. De specifieke locatie van deze map is afhankelijk van uw buildsysteem; meestal in de standaarduitvoermap van het buildsysteem of naast uw vcpkg.json
-bestand.
4 - Het project bouwen
Standaard is de manifestmodus uitgeschakeld in MSBuild-projecten.
Als u manifesten in uw project wilt inschakelen, stelt u de eigenschap VcpkgEnableManifest
in uw .vcxproj
-bestand in:
<PropertyGroup Label="Vcpkg">
<VcpkgEnableManifest>true</VcpkgEnableManifest>
</PropertyGroup>
U kunt ook de manifestmodus inschakelen in uw MSBuild-aanroep door msbuild /p:VcpkgEnableManifest=true
door te geven als parameter.
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.
Volgende stappen
In deze handleiding hebt u afhankelijkheden voor een eenvoudig project geïnstalleerd met behulp van een manifestbestand.
Hier volgen enkele extra taken om het volgende te proberen:
- Installeer pakketten voor aangepaste platforms, compilers of bouwarchitecturen met behulp van triplets
- Vergrendel uw versies voor herhaalbare builds met versiebeheer
- Binaire bestanden opnieuw gebruiken in lokale of continue integratieuitvoeringen met behulp van binaire caching-
- Uw persoonlijke bibliotheken beheren met behulp van aangepaste registers