vcpkg の概要
vcpkg は、Windows、macOS、および Linux で実行 、Microsoft と C++ コミュニティによって管理される無料のオープンソースの C/C++ パッケージ マネージャー。 これは C++ ツールであり、C++ スクリプトと CMake スクリプトを使用して記述されています。 これは、C/C++ ライブラリを管理することで、固有の問題点に対処するように設計されています。
vcpkg の理由
- 2300 以上のオープンソース ライブラリ ABI の互換性を確認するために定期的に構築されたキュレーションされたレジストリから選択できます
- 独自のカスタム ライブラリ パッケージを使用して独自の custom ライブラリ レジストリ を作成する
- Windows、macOS、Linux の一貫性のあるクロスプラットフォーム エクスペリエンス
- ビルドとプロジェクト システムを使用してプロジェクトにライブラリを簡単に追加する
- ソースから依存関係を構築するか、事前構築済みの ABI 検証済みバイナリをダウンロードします。既定では 70 を超える構成を使用でき、特定の要件に合わせてカスタマイズ 必要はありません。
- 一次バージョン管理設計を使用して、依存関係間のバージョンの競合やひし形の問題を防ぐ
- MSBuild および CMake ユーザーの場合: ビルド環境との自動統合により シームレスな依存関係の取得エクスペリエンスを実現
- 学生、オープンソースの開発者、趣味の人、プロから信頼され、大企業の一部を含む
vcpkg の機能
ポートとトリプレット
vcpkg port は、パッケージを生成するバージョン管理されたビルド レシピです。 パッケージの最も一般的な種類は、ヘッダー、ソース コード、バイナリで構成される C/C++ ライブラリです。
tripletは、ターゲットのビルド環境 (cpu、os、コンパイラ、ランタイムなど) を 1 つの便利な名前でキャプチャします。 vcpkg は既定で 70 を超えるトリプレットを提供しますが、独自のトリプレットを定義することもできます。
システムにパッケージをインストールするために、vcpkg は CMake スクリプトであるポートのレシピ ファイルを実行します。 スクリプトには、ソース コードをダウンロードする手順や、システムでビルドを実行する手順が含まれている場合があります。 ビルド中、vcpkg はトリプレット内の情報を使用して、生成されたパッケージが目的の構成と一致することを確認します。
バイナリ キャッシュ
vcpkg は必要に応じてソースからライブラリをビルドしますが、ビルドされたパッケージは binary キャッシュにバックアップできます。 これにより、他の開発者マシンや継続的インテグレーション実行では、毎回新しいビルドを実行することなく、これらの事前構築済みパッケージを参照できます。 vcpkg は、キャッシュに適切なバイナリを含む有効な既存のパッケージが既に含まれているかどうかを確認することで、再構築が必要かどうかを判断します。
マニフェスト
直接依存関係を宣言し、オプションの機能またはバージョン制約を manifest ファイルに追加。 マニフェスト ファイルは、ソース管理システムにチェックインしてチームと共有できます。
バージョン管理
vcpkg には、 パッケージ バージョンを処理する独自の方法があります。 マニフェスト ファイルは、既定で 1 つのベースライン バージョン セットを参照できます。 ベースラインを使用すると、完全な再現性を備えた、手間のかからない、競合のない依存関係管理が可能になります。 さらに、個々のパッケージ バージョンをピン留めすることで、より高度な制御を引き続き行うことができます。
レジストリ
registry は、vcpkg ユーザーがインストールできるポートと使用可能なバージョンのコレクションです。 vcpkg には、既定でオープンソース ライブラリのキュレーションされたレジストリが用意されています。 カスタマイズ、パッチ、またはプライベート ライブラリ用に独自のレジストリを作成することもできます。
資産キャッシュ
資産キャッシュ では、vcpkg をエアギャップ環境とオフライン環境で動作させ、リモート ホストがダウンしたり侵害されたりした場合でもビジネスの継続性を確保できます。 ダウンロード ミラーを使用して、ソース コードやビルド ツールなどの資産をアップロードおよび復元します。
vcpkg と他のパッケージ マネージャーの比較
vcpkg と NuGet の比較
NuGet は、C/C++ 開発、特に .NET プロジェクトを含む MSBuild ソリューションでよく使用される .NET パッケージ マネージャーです。 一般に、Microsoft C++ チームでは、NuGet にはいくつかの制限があるため、C/C++ 開発に NuGet を使用することはお勧めしません。
- コンパイルフレーバー。 NuGet はソースからすぐにパッケージをビルドできないため、すべてのユーザーに対して考えられるすべてのアプリケーション バイナリ インターフェイス (ABI) の制限に一致するように事前構築済みのバイナリを提供する必要があります。 ユーザーは、パッケージを正しくビルドする責任を負います。 また、関連するメタデータがないため、バイナリを区別することも困難です。 これにより、ユーザーはアーキテクチャ、オペレーティング システム、コンパイラの情報をパッケージ名に格納します。 パッケージの取得中にアーキテクチャ、OS、コンパイラの情報に制約を適用できないため、これは望ましくありません。
- バイナリとソース。 NuGet は、比較的小さい事前構築済みバイナリを提供するように一から設計されています。 開発者は、ABI の互換性、パフォーマンス、整合性、デバッグ可能性を確保するために、ソース コードにアクセスできる必要があります。
- NuGet PackageReference のサポートはありません。 NuGet PackageReference は、
.vcxproj
ファイルではサポートされていません。C++ プロジェクトと .NET MSBuild プロジェクトの技術的およびアーキテクチャ上の違いにより、将来追加する予定はありません。 つまり、NuGet C++ ユーザーは、グローバル キャッシュの使用や、条件付きロジックにアクセスできる単純な MSBuild 用語での依存関係の参照などの機能の恩恵を受けることはありません。 - 推移的 ABI 追跡。 vcpkg は、特定のパッケージの変更の影響を受けたオープンソースの依存関係を再構築します。 たとえば、Boost の新しい更新プログラムがリリースされた場合、vcpkg は Boost のすべての依存関係と Boost に依存するライブラリを再構築して、引き続き動作するようにします。 vcpkg リポジトリ内のライブラリを更新するためのプル要求は、ビルド時の競合に対処するまでマージされません。
vcpkg とシステム パッケージ マネージャーの比較
C/C++ ライブラリの取得と管理に使用できる Linux、macOS、Windows 用のさまざまなシステム パッケージ マネージャーがあります。 通常、これらのパッケージ マネージャーは、アプリケーションを管理するための優れた選択肢です。 しかし、サポートの一般的な性質のため、特に C/C++ 開発者にとって有益な機能を提供できないことがよくあります。 走行距離は異なりますが、一部のシステム パッケージ マネージャーはこれらの機能の一部を提供しますが、次の機能はすべて含まれていない場合があります。
- 再頒布可能な開発者アセット: vcpkg は、デバッグに役立つ再頒布可能な開発者アセットを取得できます。
- 事前構築済みパッケージとソースからのビルド: vcpkg は、カスタム要件に基づいてソースからパッケージをビルドできます。 事前構築済みの事前コンパイル済みパッケージを処理して動作させる必要はありません。
- カタログ全体のバージョン管理: vcpkg を使用すると、個々のパッケージ バージョンをマイクロ管理するのではなく、互換性のあるパッケージのバージョン セットに依存できます。 必要に応じて引き続き実行できますが、既定のエクスペリエンスは簡単に開始できるように設計されています。
- 1 つのシステム上の同じライブラリの複数のコピー: 同じ依存関係の複数のコピーを vcpkg を使用して同じシステムにインストールできますが、システム パッケージ マネージャーは、1 つのバージョンを 1 つのシステム全体の場所にインストールできます。 これは、ライブラリの異なるバージョンに応じて複数のプロジェクトがある場合に複雑になります。
- カタログ サイズ: vcpkg は C/C++ 用に特化されているため、システム パッケージ マネージャーと比較して非常に大きな C/C++ ライブラリ コレクションを持ち、アクティブに維持されます。 一般に、C++ 開発に役立つ最新のライブラリが見つかる可能性が高くなります。
- クロスプラットフォーム サポート: システム パッケージ マネージャーは、特定のシステムにロックされたパッケージを提供します。 複数のオペレーティング システムフレーバーをターゲットにする必要がある場合は、2 つ目のシステム用の別のパッケージ マネージャーを見つける必要があります。 これに対し、vcpkg はクロスプラットフォーム パッケージ マネージャーです。 そのため、必要に応じてターゲット ビルドを調整するだけです。
システム パッケージ マネージャーが絶対に理にかなっている状況があります。
- システム パッケージ マネージャーは、そのシステムに固有のライブラリの提供と保守に適したジョブを実行する傾向があります
- 使用しているプロジェクトに単純なビルド構成がある場合、事前構築済みパッケージは、そのシステムですぐに使用できます。
- クロスプラットフォーム開発を行わない場合、システム パッケージ マネージャーでオペレーティング システムの互換性の問題が発生することはありません。
vcpkg はシステム パッケージ マネージャーと並行して動作するように設計されているため、依存関係ごとに最適なツールを自由に使用できます。
vcpkg の概要
vcpkg を試すには、入門チュートリアルを確認してください。
- CMake でパッケージをインストールして使用する
- Visual Studio の CMake でパッケージをインストールして使用する
- Visual Studio で MSBuild でパッケージをインストールして使用する
- Visual Studio Code で CMake でパッケージをインストールして使用する
- vcpkg を使用してライブラリをパッケージ化する
- vcpkg キュレーション レジストリにポートを追加する
ビルド システムが CMake または MSBuild でない場合、vcpkg は好みの環境との人による統合もサポートします。
vcpkg