Poetryの--no-rootって一体何なんだ?
はじめに
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
とした場合、以下のような挙動となる。
-
pyproject.toml
に記述された依存関係を仮想環境にインストールする。 -
my_project
パッケージ自体も仮想環境下にインストールされる。
⇛site-packagesディレクトリ配下にインストールされる。
これにより、仮想環境内でimport my_project
といった感じで直接importすることが可能になる。
つまり自分が作ったパッケージ自体も自動的にインストールされるため、あたかも外部のライブラリと同列に扱える状態となる。
poetry install --no-root
の挙動
--no-root
オプションを指定した場合、以下のような挙動となる。
-
pyproject.toml
に記述された依存関係を仮想環境にインストールする。 -
my_project
パッケージはインストールされない。
先ほどとは違い、自前のルートパッケージは環境下にインストールされない。なのでimport my_project
という形で直接importすることは不可となる。
これは、まだmy_project
内のコードが完成しておらず、単に依存関係のパッケージが正しく揃っているかを確認したい場合や、トライ&エラーでソースコードを変更しながら動作確認をする際に役に立ち、開発作業を行っていく過程ではこちらのほうが都合がよい。
こちらのリンク先でもいろいろ議論されていた。
まとめ
--no-root
とすることで、通常はインストール対象となる自前のパッケージ(開発対象)が仮想環境上に現れず。あくまで外部の依存関係のみで構成された環境を作ることができる。
これまでいまいち理解ができていなかった--no-root
オプションについて、理解することができたような気がする。
Discussion