C++/パッケージマネージャ
パッケージマネージャ
編集C/C++におけるパッケージマネージャの必要性
編集近年、C/C++プログラミングにおいても外部ライブラリの利用が一般化しています。高機能なライブラリを活用することで、開発の効率化やコードの信頼性向上が図れるためです。しかし、ライブラリの導入には複雑な依存関係の管理が伴います。適切に管理されない場合、ビルドエラーやバージョン不整合などの問題が発生する可能性があります。
また、ソフトウェア開発では環境の違いによるビルド結果の変化を防ぐ必要があります。同じソースコードでも、使用するライブラリのバージョンや設定が異なれば、動作が変わってしまう可能性があるのです。これを回避するには、ビルド環境の統一が不可欠です。
このような状況において、パッケージマネージャは効率的な依存関係の管理と、プロジェクトの可搬性と再現性を実現するための重要なツールとなります。パッケージマネージャを利用すれば、必要なライブラリをすばやく入手し、簡単にセットアップできます。さらに、プロジェクトで使用するライブラリのバージョンを明示的に記述できるため、異なる環境でも同じビルド結果が得られるようになります。
主要なC/C++向けパッケージマネージャ
編集C/C++向けの主要なパッケージマネージャとして、以下の2つが広く利用されています。
Vcpkg
編集Vcpkg は、C/C++向けのオープンソースのパッケージマネージャです。GitHubでホストされており、Windows、Linux、macOSといったさまざまなプラットフォームに対応しています。CMakeベースのビルドシステムを採用しており、ビルドツールに依存しない設計となっています。
Vcpkgのインストールは公式サイト( https://vcpkg.io/ )から入手できるバイナリか、GitHubのリポジトリ( https://github.com/microsoft/vcpkg )からのクローンによって行えます。Windows向けのバイナリ配布もあり、手軽に利用を始められます。
Vcpkgを使ってライブラリをインストールする場合、以下のようなコマンドを実行します。
vcpkg install [packagename]
この vcpkg install
コマンドでパッケージをインストールすると、自動的にそのパッケージに必要な依存ライブラリも一緒にインストールされます。インストール先は vcpkg
フォルダ内の installed
ディレクトリになります。
インストール済みのパッケージとバージョンを確認するには、次のコマンドを使います。
vcpkg list
パッケージの情報を見るには、以下のように実行します。
vcpkg search [packagename]
Conan
編集Conan は、C/C++、PythonでのオープンソースおよびプロプライエタリなパッケージングのためのCross-platformで無料のパッケージマネージャです。Conanには独自のレシピ形式があり、ソースコードからバイナリパッケージをビルドし、パッケージホスティングサービスにアップロードできます。Python製のため、クロスプラットフォームに対応しています。
Conanのインストールはpipコマンドで行えます。
pip install conan
Conanでパッケージをインストールする場合、以下のようにします。
conan install [packagename/version@user/channel] --build=missing
packageのリビジョンを指定したり、ビルド設定をカスタマイズすることもできます。
conan install [packagename/version@user/channel] ...
インストールされたパッケージを確認するには以下のコマンドを使います。
conan info .
Conanにもパッケージの検索機能があり、フィルタリング指定が可能です。
conan search [packagename] --remote=all
このように、VcpkgとConanはパッケージのインストール、検索、管理を行うためのコマンドラインツールを備えています。次の節では、具体的な使用方法をご紹介します。
パッケージマネージャの基本的な使用方法
編集パッケージマネージャを使う上で最も基本的な操作は、パッケージのインストール、削除、更新、情報確認です。この節では、VcpkgとConanを例にそれぞれの方法を解説します。
パッケージのインストール
編集パッケージをインストールする際は、パッケージ名を指定してコマンドを実行します。
- Vcpkgの場合
vcpkg install [packagename]
- 例えば、広く利用されているBoostライブラリをインストールするには以下のようにします。
vcpkg install boost:x64-windows
- Conanの場合
conan install [packagename/version@user/channel] --build=missing
- versionやuser/channelを省略することもできます。例えばOpenCVの最新版をインストールする場合は、以下のようになります。
conan install opencv/4.5.1@
パッケージの削除
編集不要になったパッケージは削除できます。
- Vcpkg
vcpkg remove [packagename]
- Conan
conan remove [packagename] --src --build --packages
- --src、--build、--packagesオプションでソース、ビルド、バイナリパッケージを削除するかを細かく指定できます。
パッケージの更新
編集インストール済みのパッケージを最新版に更新することもできます。
- Vcpkg
vcpkg upgrade --no-dry-run
- Conan
conan install [packagename/version@user/channel] --update
パッケージ情報の確認
編集Vcpkgでインストール済みのパッケージ一覧を表示:
vcpkg list
- パッケージの詳細情報を表示
vcpkg search [packagename]
Conanでインストール済みのパッケージ情報を表示:
conan info .
- パッケージを検索
conan search [packagename] --remote=all
このようにパッケージマネージャのコマンドラインツールを使うことで、外部ライブラリの管理を容易に行えます
ビルドシステムとの連携
編集パッケージマネージャでインストールしたライブラリを実際のプロジェクトで活用するには、ビルドシステムと連携させる必要があります。ここではCMakeとの連携方法を中心に解説します。
CMakeでのVcpkgの利用
編集VcpkgはCMakeとの連携に最適化されています。CMakeプロジェクトのルートディレクトリに vcpkg.cmake
ツールチェーンファイルを配置し、CMakeLists.txt
で読み込むことで連携できます。
CMakeLists.txt
の設定例:
# VcpkgのMSVCツールチェーンファイルのパスを設定 set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file") # ビルドに必要なパッケージを指定 find_package(Boost REQUIRED) find_package(OpenCV REQUIRED) # ターゲットリンクライブラリを指定 target_link_libraries(myapp PRIVATE Boost::boost ${OpenCV_LIBS} )
VcpkgではCMakeのfind_packageコマンドで外部ライブラリを検出できます。ライブラリがインストールされていない場合は自動的にvcpkgコマンドでインストールを試みます。
CMakeでのConanの利用
編集ConanもCMakeと連携できますが、標準ツールチェーンファイルは用意されていません。代わりに conan.cmake
という独自のモジュールを利用します。
conanfile.txt
にプロジェクトの依存関係を記述し、
[requires] boost/1.73.0 opencv/4.5.1 [generators] cmake
conan install
コマンドで外部ライブラリをインストールします。インストール時に conan.cmake
がプロジェクトルートに生成されます。
CMakeLists.txt
で conan.cmake
を読み込むことで連携できます。
include(${CMAKE_BINARY_DIR}/conan.cmake) # パッケージのインクルードパスをプロジェクトに追加 include_directories(${CONAN_INCLUDE_DIRS}) # ターゲットリンクライブラリを指定 target_link_libraries(myapp ${CONAN_LIBS} )
このようにCMakeプロジェクトにパッケージマネージャの情報を付与することで、ビルド時に外部ライブラリを適切に読み込めるようになります。
外部ライブラリの管理
編集前節でCMakeとの連携を見たように、パッケージマネージャを使えばさまざまな外部ライブラリを簡単にインストールできます。ここでは、特にC/C++で広く利用される主要ライブラリのインストール例をご紹介します。
Boost
編集C++の汎用ライブラリであるBoostは、VcpkgやConanのパッケージとして提供されています。
- Vcpkg
vcpkg install boost:x64-windows
- Conan
conan install boost/1.73.0@
Boostは膨大なモジュールから構成されるため、必要なモジュールのみ部分的にインストールすることもできます。
OpenCV
編集コンピュータビジョンライブラリのOpenCVもインストール可能です。
- Vcpkg
vcpkg install opencv4:x64-windows
- Conan
conan install opencv/4.5.1@
Conanではコンパイル済みのOpenCV 4.5.1バイナリパッケージを提供しています。VcpkgもバイナリをPullできますが、ソースからビルドすることも可能です。
その他にも、数値計算ライブラリのEigen、自然言語処理ライブラリのOPENNLP、幾何ライブラリのCGALなど、さまざまな人気ライブラリがVcpkgやConanでインストールできます。
パッケージマネージャの高度な機能
編集ここまでは、パッケージマネージャの基本的な使い方を解説してきました。しかし、パッケージマネージャには高度な機能も備わっています。この節では、カスタムパッケージの作成、バージョン管理、マルチプラットフォーム対応など、上級者向けの機能について説明します。
カスタムパッケージの作成
編集パッケージマネージャに登録されていないライブラリを利用したい場合、自分でカスタムパッケージを作成する必要があります。
Vcpkgではパッケージ定義ファイル(CONTROL)とビルドスクリプト(portfile.cmake)を記述します。
# CONTROL ファイル Source: mylib Version: 1.0 Description: My custom library
# portfile.cmake vcpkg_from_github( OUT_SOURCE_PATH SOURCE_PATH REPO mylib/mylib REF v1.0 ) vcpkg_configure_cmake( SOURCE_PATH ${SOURCE_PATH} PREFER_NINJA ) vcpkg_install_cmake() vcpkg_copy_pdbs()
Conanではレシピ(conanfile.py)を記述してパッケージを作成します。
from conans import ConanFile, CMake class MylibConan(ConanFile): name = "mylib" version = "1.0" def source(self): self.run("git clone https://github.com/mylib/mylib.git") def build(self): cmake = CMake(self) cmake.configure() cmake.build() def package(self): self.copy("*.h", dst="include", src="mylib") self.copy("*.lib", dst="lib", keep_path=False)
これらのファイルを用意し、パッケージマネージャのコマンドを実行するとカスタムパッケージが作成できます。
バージョン管理とアップグレード
編集パッケージマネージャではライブラリのバージョン指定と、アップグレードの機能が提供されています。
Vcpkgではバージョンを指定してインストールできます。
vcpkg install boost:x64-windows@1.72.0
アップグレードはこのコマンドで実行します。
vcpkg upgrade --no-dry-run
Conanでもバージョン指定が可能です。
conan install boost/1.72.0@
アップグレードは --update
オプションをつけてインストールします。
conan install boost/1.73.0@ --update
また、ConanではGitリポジトリから直接インストールすることもできます。このようにしてリポジトリの最新版を入手できます。
conan install boost/1.73.0@conan/stable --build=missing
マルチプラットフォーム対応
編集C/C++アプリケーションはさまざまなプラットフォームで動作する必要があります。パッケージマネージャではプラットフォームごとにビルドオプションを指定して、クロスプラットフォームなバイナリパッケージを作成できます。
Vcpkgでは -Target
オプションでプラットフォームを指定します。
vcpkg install boost:x64-windows vcpkg install boost:x64-linux vcpkg install boost:x64-osx
Conanでもプラットフォーム設定が可能です。conan install
時のプロファイルでオプションを設定します。
conan install boost/1.73.0@ -s build_type=Release -s compiler=gcc -s ...
生成されたパッケージは、あらかじめ設定したリモートサーバーにアップロードしておき、必要な時にダウンロードできます。
ベストプラクティス
編集パッケージマネージャを効果的に活用するためには、適切な運用方法を心がける必要があります。この節では、パッケージマネージャの利用におけるベストプラクティスをいくつか紹介します。
セキュリティ対策
編集第三者が提供するパッケージを利用する際は、セキュリティリスクに注意を払う必要があります。パッケージにマルウェアが含まれていたり、既知の脆弱性が存在する可能性があるためです。
そこで、公的な信頼できるリポジトリからパッケージを取得することが推奨されます。Vcpkgの公式リポジトリやConanのconan-centerリポジトリなどがそれにあたります。
- Vcpkg
vcpkg install [package] --overlay-ports=https://github.com/microsoft/vcpkg
- Conan
conan install [package] --remote=conan-center
信頼できないソースからパッケージを取得する場合は、ソースコードを確認し、脆弱性のスキャンを行うなどの対策が必要です。
キャッシュの活用
編集ネットワーク経由でパッケージをダウンロードしてくると、回線状況によっては時間がかかる可能性があります。特に大規模なプロジェクトでは、この影響が無視できません。
そこでパッケージマネージャではキャッシュ機能が用意されています。一度ダウンロードしたパッケージはキャッシュに保存されるので、2回目以降は高速にインストールできます。
Vcpkgのキャッシュは以下のディレクトリに保存されています。
%VCPKG_ROOT%\packages
Conanのキャッシュは、デフォルトで以下の場所に置かれています。
~/.conan
このキャッシュディレクトリはリポジトリのように扱え、共有やバックアップも可能です。複数の開発者で同じキャッシュを参照すれば、無駄な通信トラフィックを大幅に削減できます。
CIでの利用
編集継続的インテグレーション(CI)ではビルド環境の完全な再現が重要です。そこでパッケージマネージャを導入することで、確実に同一の外部ライブラリをインストールでき、ビルド再現性が高まります。
CIサービスの多くは、パッケージマネージャをあらかじめサポートしています。例えばAppVeyorではVcpkgが利用でき、CircleCIではConanが利用可能です。
CIの設定ファイルに、パッケージマネージャのインストールと依存ライブラリのインストール手順を記述します。以下はVcpkgとCircleCIの例です。
# CircleCI の設定ファイル jobs: build: docker: - image: circleci/python:3.7 steps: # VcpkgのセットアップとBoostライブラリのインストール - run: name: Install Vcpkg and Dependencies command: | git clone https://github.com/Microsoft/vcpkg.git ./vcpkg/bootstrap-vcpkg.sh ./vcpkg/vcpkg install boost:x64-linux # プロジェクトのビルド - checkout - run: command: | mkdir build cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake make
このようにCIでパッケージマネージャを活用することで、本番環境でのビルド確認が確実になり、品質の向上が期待できます。
まとめ
編集この章では、C/C++開発におけるパッケージマネージャの必要性と、主要なパッケージマネージャであるVcpkgとConanの使い方を詳しく解説してきました。
パッケージマネージャを利用することで、次のようなメリットが得られます。
- 外部ライブラリの簡単なインストールと管理
- 依存関係の自動解決
- プロジェクトの可搬性と再現性の向上
- ビルド時間の短縮
- 開発の効率化
特にC/C++のようにコンパイル時間が長く、多くの外部ライブラリに依存するプロジェクトではパッケージマネージャの導入が不可欠といえます。
一方で、パッケージマネージャを安全かつ効率的に運用するために、セキュリティ対策やキャッシュの活用、CIでの利用などのベストプラクティスも押さえておく必要があります。
パッケージマネージャはC/C++の開発環境を大きく改善するツールです。本章で解説した内容を活かして、ぜひ実際の開発でパッケージマネージャを積極的に活用していただければと思います。
今後もパッケージマネージャはさらに進化を続けていくでしょう。新しい機能の追加や、より使いやすくなるための改善が行われていくことが予想されます。C/C++開発者としては、これらの動向に注目し、よりよいツールを取り入れていくことが重要になるでしょう。