notes
Tools

vendoring (依存のリポジトリ内取り込み)

外部依存のソースを自リポに取り込むこと。build 再現性を上げるが drift と二重管理の対価がある

要点#

vendor する = 外部依存 (ライブラリ / パッケージ) のソースコードを自分のリポジトリまたはビルドツリーに取り込み、外部から取得せずに build/run できる状態にすること。名詞 "vendor" (供給者) から派生した動詞。

なぜやるか#

  1. ビルド再現性: 外部リポが消滅・tag が動く・URL 変更で CI が壊れなくなる
  2. 依存解決の単純化: package manager (apt/rosdep/pip) に未登録の内部/未公開ライブラリを build system に持ち込める
  3. オフラインビルド: Docker image に事前焼き込み可能
  4. patch を先行適用: upstream の PR merge を待たずに自分側の修正版を使える

何を捨てるか#

  • upstream との drift: 手動で追随しないと古くなる
  • 二重管理: bug fix / セキュリティ更新のたびに手動 sync
  • サイズ: リポが大きくなる
  • ライセンス: vendor 対象のライセンスに従う (BSD/Apache 系は基本 OK、GPL は要注意)

ROS 2 の *_vendor パッケージ#

ROS 2 コミュニティの慣習で、外部の非-ament ライブラリを ament の依存グラフに乗せる薄いラッパーパッケージが <name>_vendor の命名で存在する。実例:

  • tinyxml2_vendor
  • foonathan_memory_vendor
  • curl_vendor
  • console_bridge_vendor

中身は薄い CMake で:

  1. ExternalProject_Add() で upstream の tag/commit から source を fetch
  2. ament の build tree 内で configure + make + install
  3. <name>_vendorConfig.cmake を export、下流 package が find_package(<Name>) で見つけられる形に整える

これで下流の ROS 2 package は、外部ライブラリが <name>_vendor 経由で来ていることを意識せずに使える。

代替案 (取り込まない選択肢)#

vendoring 以外で外部依存を扱う方法:

  • package manager にリリース: rosdep + apt / pip / cargo / go mod で公式解決。依存追跡はきれいだが release パイプラインが要る
  • vcs import (ROS 2 の場合): .repos ファイルに列挙、vcs import でワークスペースに clone。CI 内で source ビルドできる。upstream 追随が容易だが clone 時間が毎回かかる (cache でカバー可)
  • git submodule: submodule として参照。commit ピン留めできるが submodule 特有のフットガンあり (git clone --recursive 忘れ等)

判断基準#

状況推奨
upstream が安定していて頻繁に触らないvendor
頻繁に upstream を追う (fork して patch を当てながら開発)vcs import + patch commit
社内で ownership を持つライブラリで、他 project も使う社内 apt / registry に release
一度きりの小さな依存vendor (drift も最小限)

関連#

  • ROS 2 の rosdep: 外部依存の解決規約
  • Ament の ExternalProject_Add() ラッピング

逃げ道: なぜ vendor しないで済ませたいか#

vendor は最短で問題を消せるが、二重管理のコストが継続する。「今回だけ動けばいい」を続けると vendor したライブラリが 5 個増える。upstream にリリースパイプラインを引けるなら、その方が中長期の負債は小さい。

最終更新:

On this page