vcpkg-Übersicht
vcpkg ist ein kostenloser und open-source C/C++-Paket-Manager, der von Microsoft und der C++-Community verwaltet wird, die unter Windows, macOS und Linux ausgeführt wird. Es ist ein C++-Tool im Herzen und wird mit C++- und CMake-Skripts geschrieben. Es wurde entwickelt, um die eindeutigen Schmerzpunkte mit der Verwaltung von C/C++-Bibliotheken zu behandeln.
Warum vcpkg?
- Über 2300 Open-Source-Bibliotheken zur Auswahl in einer kuratierten Registrierung, die routinemäßig erstellt wurde, um die ABI-Kompatibilität zu überprüfen
- Erstellen Einer eigenen benutzerdefinierten Bibliotheksregistrierung mit ihren eigenen benutzerdefinierten Bibliothekspaketen
- Konsistente, plattformübergreifende Erfahrung für Windows, macOS und Linux
- Hinzufügen von Bibliotheken zu Ihrem Projekt mit jedem Build- und Projektsystem
- Erstellen von Abhängigkeiten aus der Quelle oder Herunterladen vordefinierter ABI-überprüfter Binärdateien, mit über 70 standardmäßig verfügbaren Konfigurationen und unendlicher Anpassung für Ihre spezifischen Anforderungen
- Verhindern von Versionskonflikten und Rautenproblemen zwischen Abhängigkeiten mit einem eindeutigen Versionsverwaltungsdesign
- Für MSBuild- und CMake-Benutzer: automatische Integration in Ihre Buildumgebung für eine nahtlose Abhängigkeitserwerbserfahrung
- Vertrauen von Studenten, Open-Source-Entwicklern, Hobbyisten und Profis, einschließlich einiger der größten Unternehmen
vcpkg-Features
Ports und Triplets
Ein vcpkg-Port ist ein versionsiertes Buildrezept, das ein Paket erzeugt. Der am häufigsten verwendete Pakettyp ist eine C/C++-Bibliothek, die aus Headern, Quellcode und Binärdateien besteht.
Ein Triplet erfasst die Zielbuildumgebung (CPU, Betriebssystem, Compiler, Laufzeit usw.) in einem einzigen, praktischen Namen. vcpkg bietet standardmäßig mehr als 70 Triplets, Aber Sie können auch eigene definieren.
Um ein Paket auf Ihrem System zu installieren, führt vcpkg die Rezeptdatei des Ports aus, bei der es sich um ein CMake-Skript handelt. Das Skript enthält möglicherweise Schritte zum Herunterladen von Quellcode oder zum Ausführen eines Builds auf Ihrem System. Während der Builds verwendet vcpkg die Informationen in Ihrem Triplet, um sicherzustellen, dass das produzierte Paket mit Ihrer gewünschten Konfiguration übereinstimmt.
Binäre Zwischenspeicherung
Während vcpkg Bibliotheken immer dann aus der Quelle erstellt, wenn dies erforderlich ist, können Sie ihre integrierten Pakete in einem Binären Cache sichern. Auf diese Weise können andere Entwicklercomputer oder fortlaufende Integrationsläufe auf diese vordefinierten Pakete verweisen, ohne jedes Mal einen neuen Build auszuführen. vcpkg bestimmt, ob eine Neuerstellung erforderlich ist, indem überprüft wird, ob der Cache bereits ein gültiges vorhandenes Paket mit entsprechenden Binärdateien enthält.
Manifeste
Sie können Ihre direkten Abhängigkeiten deklarieren und optionale Features oder Versionseinschränkungen in einer Manifestdatei hinzufügen. Manifestdateien können in Ihr Quellcodeverwaltungssystem eingecheckt und für Ihr Team freigegeben werden.
Versionsverwaltung
vcpkg verfügt über eine einzigartige Methode zum Behandeln von Paketversionen. Ihre Manifestdatei kann standardmäßig auf eine einzelne Basisversion verweisen. Die Basislinie bietet Ihnen stressfreies, konfliktfreies Abhängigkeitsmanagement mit vollständiger Reproduzierbarkeit. Darüber hinaus können Sie noch erweiterte Kontrolle haben, indem Sie einzelne Paketversionen anheften.
Registrierungen
Eine Registrierung ist eine Sammlung von Ports und verfügbaren Versionen, die ein vcpkg-Benutzer installieren kann. vcpkg stellt standardmäßig eine kuratierte Registrierung von Open-Source-Bibliotheken bereit. Sie können auch eigene Registrierungen für Anpassungen, Patches oder private Bibliotheken erstellen.
Zwischenspeichern von Ressourcen
Die Zwischenspeicherung von Ressourcen ermöglicht es vcpkg, in luftgespaltenen und Offlineumgebungen zu arbeiten und so die Geschäftskontinuität sicherzustellen, auch wenn ein Remotehost heruntergeht oder kompromittiert wird. Es verwendet Downloadspiegel zum Hochladen und Wiederherstellen von Ressourcen wie Quellcode und Buildtools.
vcpkg im Vergleich zu anderen Paketmanagern
vcpkg im Vergleich zu NuGet
NuGet ist ein .NET-Paket-Manager, der häufig für die C/C++-Entwicklung verwendet wird, insbesondere für MSBuild-Lösungen, die .NET-Projekte enthalten. Im Allgemeinen empfiehlt das Microsoft C++-Team nicht die Verwendung von NuGet für C/C++-Entwicklung, da NuGet mehrere Einschränkungen hat:
- Kompilierungsaromen. Da NuGet keine Pakete aus der Quelle erstellen kann, ist es erforderlich, vordefinierte Binärdateien bereitzustellen, um alle möglichen Einschränkungen der Application Binary Interface (ABI) für alle Benutzer abzugleichen. Der Benutzer ist für das ordnungsgemäße Erstellen von Paketen verantwortlich. Es ist auch schwierig, aufgrund fehlender relevanter Metadaten zwischen Binärdateien zu unterscheiden. Dies führt dazu, dass der Benutzer Architektur, Betriebssystem und Compilerinformationen im Paketnamen einlegt. Dies ist unerwünscht, da Einschränkungen für Architektur, Betriebssystem und Compilerinformationen während des Paketerwerbs nicht erzwungen werden können.
- Binary vs. source. NuGet wurde von Grund auf entwickelt, um relativ kleine, vorgefertigte Binärdateien bereitzustellen. Entwickler müssen Zugriff auf den Quellcode haben, um ABI-Kompatibilität, Leistung, Integrität und Debugbarkeit sicherzustellen.
- Keine NuGet PackageReference-Unterstützung. NuGet PackageReference wird für
.vcxproj
Dateien nicht unterstützt, und es gibt keinen Plan, sie in Zukunft aufgrund technischer und architektonischer Unterschiede zwischen C++ und .NET MSBuild-Projekten hinzuzufügen. Dies bedeutet, dass NuGet C++-Benutzer nicht von Features wie der Verwendung des globalen Caches und verweisen auf Abhängigkeiten in einfachen MSBuild-Ausdrücken mit Zugriff auf bedingte Logik profitieren. - Transitive ABI-Nachverfolgung. vcpkg erstellt Open-Source-Abhängigkeiten, die von einer Änderung in einem bestimmten Paket betroffen sind. Wenn beispielsweise ein neues Update für Boost veröffentlicht wird, erstellt vcpkg alle Abhängigkeiten von Boost neu, und Bibliotheken, die von Boost abhängen, um sicherzustellen, dass sie weiterhin funktionieren. Pullanforderungen zum Aktualisieren von Bibliotheken im vcpkg-Repository werden erst zusammengeführt, wenn Buildzeitkonflikte behoben werden.
vcpkg im Vergleich zu Systempaket-Managern
Es gibt eine Vielzahl von Systempaketmanagern für Linux, macOS und Windows, die zum Erwerben und Verwalten von C/C++-Bibliotheken verwendet werden können. Diese Paketmanager sind in der Regel hervorragende Auswahlmöglichkeiten für die Verwaltung von Anwendungen. Aufgrund der generischen Art ihrer Unterstützung können sie jedoch häufig keine Features bereitstellen, die besonders für C/C++-Entwickler von Vorteil sind. Während Ihre Kilometerzahl variieren wird, und einige Systempaketmanager einige dieser Features bereitstellen, verfügen keine über alle folgenden Features:
- Verteilbare Entwicklerressourcen: vcpkg kann verteilbare Entwicklerressourcen erwerben, um beim Debuggen zu helfen.
- Vordefinierte Pakete im Vergleich zum Build aus der Quelle: vcpkg kann Pakete basierend auf Ihren benutzerdefinierten Anforderungen aus der Quelle erstellen. Es ist nicht erforderlich, sich mit vordefinierten, vorkompilierten Paketen zu befassen, um sie zur Arbeit zu bringen.
- Katalogweite Versionsverwaltung: vcpkg ermöglicht Es Ihnen, von einer Versionsgruppe kompatibler Pakete zu abhängen, anstatt einzelne Paketversionen zu verwalten. Sie können dies weiterhin nach Bedarf tun, aber die Standardoberfläche ist so konzipiert, dass sie einfach beginnen kann.
- Mehrere Kopien derselben Bibliothek auf einem System: Sie können mehrere Kopien derselben Abhängigkeit auf demselben System mit vcpkg installiert haben, während Systempaketmanager eine Version an einem einzigen, systemweiten Speicherort installieren können. Dadurch werden Dinge kompliziert, wenn Sie je nach verschiedenen Versionen einer Bibliothek mehrere Projekte haben.
- Kataloggröße: Da vcpkg auf C/C++ spezialisiert ist, verfügt es im Vergleich zu Systempaketmanagern über eine sehr große C/C++-Bibliothekssammlung und wird aktiv verwaltet. Im Allgemeinen sind Sie wahrscheinlicher, nützliche und aktuelle Bibliotheken für die C++-Entwicklung zu finden.
- Plattformübergreifende Unterstützung: Systempaketmanager stellen Pakete bereit, die für ein bestimmtes System gesperrt sind. Wenn Sie mehr als einen Betriebssystemgeschmack verwenden müssen, müssen Sie einen anderen Paket-Manager für das zweite System finden. Im Gegensatz dazu ist vcpkg ein plattformübergreifender Paket-Manager. Daher müssen Sie ihre Zielbuilds einfach entsprechend anpassen.
Es gibt Situationen, in denen ein Systempaket-Manager absolut sinnvoll ist:
- Systempaketmanager sind in der Regel gut geeignet, Bibliotheken bereitzustellen und zu verwalten, die für dieses System spezifisch sind.
- Vordefinierte Pakete sollten in diesem System sofort funktionieren, wenn Ihr verbrauchendes Projekt über eine einfache Buildkonfiguration verfügt.
- Wenn Sie keine plattformübergreifende Entwicklung durchführen möchten, treten keine Kompatibilitätsprobleme mit dem Betriebssystem-Paket-Manager auf.
vcpkg ist für die parallele Arbeit mit Systempaketmanagern konzipiert, daher können Sie das Tool verwenden, das für jede Abhängigkeit am sinnvollsten ist.
Erste Schritte mit vcpkg
Um vcpkg auszuprobieren, schauen Sie sich unsere Einführungslernprogramme an:
- Installieren und Verwenden von Paketen mit CMake
- Installieren und Verwenden von Paketen mit CMake in Visual Studio
- Installieren und Verwenden von Paketen mit MSBuild in Visual Studio
- Installieren und Verwenden von Paketen mit CMake in Visual Studio Code
- Packen einer Bibliothek mit vcpkg
- Hinzufügen eines Ports zur kuratierten vcpkg-Registrierung
Wenn Ihr Buildsystem nicht CMake oder MSBuild ist, unterstützt vcpkg auch die manuelle Integration in Ihre bevorzugte Umgebung.