Leggere in inglese

Condividi tramite


Panoramica di vcpkg

vcpkg è uno strumento di gestione pacchetti C/C++ gratuito e open source gestito da Microsoft e dalla community C++ in esecuzione in Windows, macOS e Linux. Si tratta di uno strumento C++ a cuore e scritto usando script C++ e CMake. È progettato per risolvere i punti deboli univoci con la gestione delle librerie C/C++.

Perché vcpkg?

Funzionalità di vcpkg

Porte e triplette

Una porta vcpkg è una ricetta di compilazione con versione che produce un pacchetto. Il tipo di pacchetto più comune è una libreria C/C++ costituita da intestazioni, codice sorgente e file binari.

Un triplet acquisisce l'ambiente di compilazione di destinazione (cpu, sistema operativo, compilatore, runtime e così via) in un unico nome pratico. vcpkg offre più di 70 triplette per impostazione predefinita, ma è anche possibile definire il proprio.

Per installare un pacchetto nel sistema, vcpkg esegue il file di ricetta della porta, ovvero uno script CMake. Lo script potrebbe contenere passaggi per scaricare il codice sorgente o per eseguire una compilazione nel sistema. Durante le compilazioni, vcpkg usa le informazioni nel triplet per assicurarsi che il pacchetto prodotto corrisponda alla configurazione desiderata.

Memorizzazione nella cache binaria

Anche se vcpkg compila librerie dall'origine ogni volta che è necessario, è possibile eseguire il backup dei pacchetti predefiniti in una cache binaria. Ciò consente ad altri computer per sviluppatori o esecuzioni di integrazione continua di fare riferimento a questi pacchetti predefiniti senza eseguire una nuova compilazione ogni volta. vcpkg determina se è necessaria una ricompilazione controllando se la cache contiene già un pacchetto esistente valido con i file binari appropriati.

Manifesti

È possibile dichiarare le dipendenze dirette e aggiungere funzionalità facoltative o vincoli di versione in un file manifesto. I file manifesto possono essere controllati nel sistema di controllo del codice sorgente e condivisi con il team.

Controllo delle versioni

vcpkg offre un modo unico per gestire le versioni dei pacchetti. Il file manifesto può fare riferimento a una singola versione di base impostata per impostazione predefinita. La baseline offre una gestione delle dipendenze senza problemi e senza conflitti con riproducibilità completa. Inoltre, è comunque possibile avere un controllo più avanzato aggiungendo singole versioni del pacchetto.

Registri

Un registro è una raccolta di porte e versioni disponibili che un utente vcpkg può installare. vcpkg fornisce un registro curato di librerie open source per impostazione predefinita. È anche possibile creare registri personalizzati per personalizzazioni, patch o librerie private.

Memorizzazione nella cache degli asset

La memorizzazione nella cache degli asset consente a vcpkg di funzionare in ambienti con disponibilità elevata e offline, garantendo la continuità aziendale anche se un host remoto diventa inattivo o compromesso. Usa mirror di download per caricare e ripristinare asset come il codice sorgente e gli strumenti di compilazione.

vcpkg rispetto ad altri gestori pacchetti

vcpkg rispetto a NuGet

NuGet è una gestione pacchetti .NET che viene spesso usata per lo sviluppo C/C++, in particolare per le soluzioni MSBuild che contengono progetti .NET. Come regola generale, il team di Microsoft C++ non consiglia l'uso di NuGet per lo sviluppo C/C++ perché NuGet presenta diverse limitazioni:

  • Versioni di compilazione. Poiché NuGet non può compilare pacchetti dall'origine in tempo reale, è necessario fornire file binari predefiniti in modo che corrispondano a tutte le possibili restrizioni dell'interfaccia ABI (Application Binary Interface) per tutti gli utenti. L'utente è responsabile della corretta compilazione dei pacchetti. È anche difficile distinguere tra file binari a causa della mancanza di metadati pertinenti. In questo modo, l'utente inserisce le informazioni sull'architettura, sul sistema operativo e sul compilatore nel nome del pacchetto. Ciò è indesiderato perché i vincoli relativi all'architettura, al sistema operativo e alle informazioni del compilatore non possono essere applicati durante l'acquisizione del pacchetto.
  • Confronto tra file binari e origine. NuGet è progettato da zero per fornire file binari predefiniti relativamente piccoli. Gli sviluppatori devono avere accesso al codice sorgente per garantire compatibilità, prestazioni, integrità e debug ABI.
  • Nessun supporto nuGet PackageReference. NuGet PackageReference non è supportato per .vcxproj i file e non esiste un piano per aggiungerlo in futuro a causa di differenze tecniche e architetturali tra progetti C++ e .NET MSBuild. Ciò significa che gli utenti di NuGet C++ non trarranno vantaggio da funzionalità come l'uso della cache globale e il riferimento alle dipendenze in semplici termini di MSBuild con accesso alla logica condizionale.
  • Rilevamento ABI transitivo. vcpkg ricompila le dipendenze open source interessate da una modifica in un determinato pacchetto. Ad esempio, se viene rilasciato un nuovo aggiornamento per Boost, vcpkg ricompila tutte le dipendenze di Boost e le librerie che dipendono da Boost, per assicurarsi che funzionino ancora. Le richieste pull per aggiornare le librerie nel repository vcpkg non vengono unite fino a quando non vengono risolti conflitti in fase di compilazione.

vcpkg rispetto alle gestioni pacchetti di sistema

Esistono un'ampia gamma di gestori pacchetti di sistema per Linux, macOS e Windows che possono essere usati per acquisire e gestire librerie C/C++. Queste gestioni pacchetti sono in genere scelte eccellenti per la gestione delle applicazioni. Tuttavia, a causa della natura generica del supporto, spesso non riescono a offrire funzionalità utili soprattutto per gli sviluppatori C/C++. Anche se il chilometraggio varia e alcuni gestori di pacchetti di sistema offrono alcune di queste funzionalità, nessuna ha tutte le seguenti caratteristiche:

  • Asset di sviluppo ridistribuibili: vcpkg può acquisire asset di sviluppo ridistribuibili per facilitare il debug.
  • Pacchetti predefiniti e compilazione dall'origine: vcpkg può compilare pacchetti dall'origine in base ai requisiti personalizzati. Non è necessario occuparsi di pacchetti predefiniti e precompilato per farli funzionare.
  • Controllo delle versioni a livello di catalogo: vcpkg consente di dipendere da un set di versioni di pacchetti compatibili, invece di dover microgestire singole versioni dei pacchetti. È comunque possibile farlo in base alle esigenze, ma l'esperienza predefinita è progettata per essere facile da iniziare.
  • Più copie della stessa libreria in un sistema: è possibile avere più copie della stessa dipendenza installate nello stesso sistema con vcpkg, mentre i gestori pacchetti di sistema possono installare una versione in un'unica posizione a livello di sistema. Ciò complica le cose quando si dispone di più progetti a seconda di versioni diverse di una libreria.
  • Dimensioni del catalogo: poiché vcpkg è specializzato per C/C++, ha una raccolta di librerie C/C++ molto grande rispetto alle gestioni pacchetti di sistema e viene mantenuta attivamente. In generale, è più probabile trovare librerie utili e aggiornate per lo sviluppo C++.
  • Supporto multipiattaforma: gli strumenti di gestione pacchetti di sistema forniscono pacchetti bloccati in un particolare sistema. Se è necessario specificare come destinazione più di un tipo di sistema operativo, sarà necessario trovare un gestore pacchetti diverso per il secondo sistema. Al contrario, vcpkg è una gestione pacchetti multipiattaforma. Quindi, è sufficiente modificare le compilazioni di destinazione di conseguenza.

Ci sono situazioni in cui uno strumento di gestione pacchetti di sistema ha assolutamente senso:

  • Gli strumenti di gestione pacchetti di sistema tendono a svolgere un buon lavoro fornendo e mantenendo librerie specifiche di tale sistema
  • I pacchetti predefiniti devono funzionare correttamente in tale sistema se il progetto di utilizzo ha una configurazione di compilazione semplice.
  • Se non si prevede di eseguire alcuno sviluppo multipiattaforma, non si verificano problemi di compatibilità del sistema operativo con una gestione pacchetti di sistema.

vcpkg è progettato per lavorare side-by-side con gli strumenti di gestione pacchetti di sistema, quindi è possibile usare lo strumento più appropriato per ogni dipendenza.

Introduzione a vcpkg

Per provare vcpkg, vedere le esercitazioni introduttive:

Se il sistema di compilazione non è CMake o MSBuild, vcpkg supporta anche l'integrazione manuale con l'ambiente preferito.