🤔

Poetryの--no-rootって一体何なんだ?

2024/12/20に公開

はじめに

Poetryを使って仮想環境を扱った開発をしていて、--no-rootというオプションに遭遇したことはないだろうか。

poetry install --no-root

といった感じにコマンドを実行すると、プロジェクト内に存在するpyproject.tomlファイルに記述された依存関係がローカルの仮想環境にインストールされる。
何度か--no-rootオプションについて調べたことはあったがいまいちよくわからない。

これからもPoetryを使って開発をしていく中でこのままよくわからない状態にしておくのはよくないなと思い、自分なりに調査した結果をまとめることにする。
尚、本記事の内容が誤っていたり、私の理解が甘かったりした際はコメントにて指摘していただけると非常に有り難く思う。

そもそもPoetryって?

Poetryは、Pythonのパッケージ管理ツールの一つで、プロジェクト内の依存関係を仮想環境を使って管理することができる。

PoetryはPythonの依存関係管理とパッケージングのためのツールです。 あなたのプロジェクトが依存するライブラリを宣言することができ、あなたのためにそれらを管理(インストール/更新)します。 Poetryは、繰り返しインストールできるようにロックファイルを提供し、配布用にプロジェクトをビルドすることができます。
https://python-poetry.org/docs/

一般的にローカルマシン上には複数のプロジェクトが混在する状態で開発することが想定されるが、この際、パッケージ管理ツールを使って仮想環境を切り替えながら開発することで、各プロジェクト間の依存関係の差異などを気にすることなく開発することが可能となる。
Poetry自体には色々なコマンドがあるがここでは触れず、今回はpoetry installというコマンドに焦点を絞ることとする。

--no-rootオプションってなんだ?

poetry installというコマンドを実行することで、ローカルマシン上にプロジェクトが利用するパッケージやライブラリの依存関係をインストールすることができるのだが、この際--no-rootというオプションを付与することができる。

まずinstallコマンドは以下のように説明されている

installコマンドは、現在のプロジェクトからpyproject.tomlファイルを読み込み、依存関係を解決し、それらをインストールします。
https://python-poetry.org/docs/cli/#install

つまり、pyproject.toml(poetry.lock)ファイルに記述されている依存関係を仮想環境にインストールする。(poetry.lockファイルがある場合はそちらに従う)

--no-rootオプションについては以下のように説明されている。

このインストールをスキップしたい場合は、--no-rootオプションを使用する。

つまりどういうことだ?

installコマンドについて

前述したようにinstallコマンドは依存関係を仮想環境にインストールするわけだが、この時--no-rootオプションを指定するかしないかによってインストールするパッケージが一部変わる。
Poetryのinstallコマンドはデフォルトでは自身のプロジェクトがパッケージとしてインストールされる。

例えば以下のようなディレクトリ構造を持ったプロジェクトを想定して解説してみる。

my_project/
│
├─ pyproject.toml
├─ poetry.lock
├─ README.md
└─ my_project/ # これがルートのパッケージであり開発対象
   ├─ __init__.py
   ├─ main.py
   └─ utils.py

通常のpoetry installの挙動

単純にpoetry installとした場合、以下のような挙動となる。

  1. pyproject.tomlに記述された依存関係を仮想環境にインストールする。
  2. my_projectパッケージ自体も仮想環境下にインストールされる。
    ⇛site-packagesディレクトリ配下にインストールされる。

これにより、仮想環境内でimport my_projectといった感じで直接importすることが可能になる。
つまり自分が作ったパッケージ自体も自動的にインストールされるため、あたかも外部のライブラリと同列に扱える状態となる。

poetry install --no-rootの挙動

--no-rootオプションを指定した場合、以下のような挙動となる。

  1. pyproject.tomlに記述された依存関係を仮想環境にインストールする。
  2. my_projectパッケージはインストールされない

先ほどとは違い、自前のルートパッケージは環境下にインストールされない。なのでimport my_projectという形で直接importすることは不可となる。
これは、まだmy_project内のコードが完成しておらず、単に依存関係のパッケージが正しく揃っているかを確認したい場合や、トライ&エラーでソースコードを変更しながら動作確認をする際に役に立ち、開発作業を行っていく過程ではこちらのほうが都合がよい。

こちらのリンク先でもいろいろ議論されていた。

まとめ

--no-rootとすることで、通常はインストール対象となる自前のパッケージ(開発対象)が仮想環境上に現れず。あくまで外部の依存関係のみで構成された環境を作ることができる。

これまでいまいち理解ができていなかった--no-rootオプションについて、理解することができたような気がする。

Discussion