pyてよn日記

一寸先は闇が人生

ソフトウェア開発における「ベンダリング vendoring」という概念

ソフトウェア開発で出てくる「ベンダリング vendoring」という言葉についてまとめた(英語では vendoring の他,vendorizing などと呼ばれるが,vendorizing の検索結果はかなり少ない).

ベンダリングとは

ベンダリングについて説明する.ここでは,Golang でのベンダリング vendoring の説明を引用する.

Vendoring is the act of making your own copy of the 3rd party packages your project is using. Those copies are traditionally placed inside each project and then saved in the project repository.

ベンダリング」とは,プロジェクトで利用している 3rd パーティ製のパッケージのコピーを作り,プロジェクトのリポジトリソースコードとして保存することである.3rd パーティ製のパッケージ等,所謂 dependencies をプロジェクトのリポジトリに入れてしまうということである.

一般的には筆者の(少ない)経験の中では,3rd パーティ製のパッケージはプロジェクトのリポジトリでは管理しないことが多いため(venv とか node_modules とかは git の管理から外すよね?),ベンダリングはこの観点では対極に位置する.

ベンダリングの利点

もっとたくさんあると思う.

  • リポジトリ単体を独立したパッケージとして扱うことができ,環境を汚さずに動かすことができる(そのリポジトリと実行環境があればどこでも動かせる)
  • (筆者の思い付き)リポジトリ内に置いておけば改めてインストールする必要がないため,パッケージが置いてある外部のリポジトリの障害などに影響を受けない.

ベンダリングの例:Poetry のインストーラ

ベンダリングの例を挙げる.

Python のパッケージ管理ツール Poetry のインストールには,pip install poetry ではなく,専用のインストーラを利用した,「ベンダリング」を伴うインストールが推奨されている.これは,pip install によりインストールされる Poetry の dependencies により,環境が汚れてしまうことを防ぐためである. (dependencies は「依存関係」とも呼ばれる.あるパッケージが動くために必要な他のパッケージのことである.開発環境のみで使われるパッケージ(linter など)は dev-dependencies という.).

pip install poetry でインストールした場合,Poetry とその dependencies は,「Poetry が親,dependencies が子」という関係はありつつも,1 つ 1 つが独立したパッケージ(site-packages)として扱われる.つまり,dependencies により環境が汚される

一方,ベンダリングを伴うインストールを行った場合,dependencies が Poetry のプロジェクトルート配下のパッケージ(のようなもの)として扱われることになる.「ベンダリング」の意味に沿うと,「Poetry のプロジェクトディレクトリ(リポジトリ)に depndencies をコピーし保存する」ということになる.これにより,「Poetry + dependencies」を 1 つの「Poetry」というパッケージとして使用することができる.ベンダリングを伴うインストールを行った場合,dependencies が Poetry 内に隔離されているため環境が汚されず,消去したい時は Poetry を消去すれば dependencies も消去できる

二つのインストールのパターンをざっとまとめた.

  • ベンダリングを伴わない,pip install poetry の場合
    • 「Poetry が親,dependencies が子」という関係はありつつも,1 つ 1 つが独立したとしてパッケージとして扱われる.Poetry をアンインストールしても dependencies はアンインストールされない
- poetry  # <-- これをアンインストールしても dependecies は残存する
- requests
- cleo
- jsonschema
- pexpect
- requests-toolbelt
- pyparsing
- cachy
- keyring
- clikit
- cachecontrol
- pyrsistent
- html5lib
- shellingham
- pkginfo
- tomlkit
  • ベンダリングを伴うインストールを行う場合
    • poetry 配下に dependencies が存在するため,poetry をアンインストールすれば dependencies もアンインストールされる.
- poetry  # <-- これをアンインストールすれば全てアンインストールされる
  - requests
  - cleo
  - jsonschema
  - pexpect
  - requests-toolbelt
  - pyparsing
  - cachy
  - keyring
  - clikit
  - cachecontrol
  - pyrsistent
  - html5lib
  - shellingham
  - pkginfo
  - tomlkit

終わりに

「パッケージを隔離して管理すると良いことあるよね」って理解をした.もっと色々な利点があると思うけど如何せん知っている例が少なすぎる(ネタバラシをすると Poetry のインストールの段階で「ベンダリング」が出てきて初めて知った).よく vendor みたいな形で CSS とか JavaScript のパッケージが置かれているのは見るなあ,と記事が書き終わりそうになった段階で気づいた.

ソフトウェア開発では「よく出てくるけど意味が分かりづらい単語」っていろいろあるよね.これは大事だよって単語があれば教えてください.最後まで読んでくださりありがとうございました.