poetry add @latest で Incompatible constraints エラーが出た原因
はじめに
Poetry を利用した Python プロジェクトにおいて、
既存環境のパッケージ更新で少しハマった点があったため、備忘としてまとめます。
プロジェクト構築者とメンテナンス担当者(後任)が異なるケースで発生しやすい内容です。
環境
- WSL 2.6(Ubuntu)
- poetry 2.1
前提
- すでに Poetry でプロジェクトが作成されている
- プロジェクトの構築者と、現在のメンテナンス担当者が異なる
目的
- プロジェクトで使用しているすべてのパッケージを最新化すること
- 具体的には、
poetry show --outdatedで表示されるパッケージをなくすこと
パッケージ更新
poetryの日本語サイトから、以下の使い分けと理解してます。
制約内のバージョンアップ
pyproject.tomlに記載されているバージョン制約内でバージョンアップする
poetry update
poetry.lockが更新される
制約外のバージョンアップ
pyproject.tomlに記載されているバージョン制約自体を更新する
poetry add
最新バージョンにする場合は@latestを付ける
poetry add パッケージ名@latest
pyproject.toml、poetry.lockが更新される
エラー発生手順
以下の手順で、パッケージを更新しました。
-
現状のパッケージバージョンを確認
poetry show --outdated -
制約内のバージョンアップを実行
poetry update -
更新結果を確認(期待通り、パッケージ数が少なくなる)
poetry show --outdated -
制約外のバージョンアップを実行
poetry add パッケージ名@latest -
以下のエラーが発生
Incompatible constraints in requirements of プロジェクト名
原因と対処
依存関係が以下のようにグループに分かれておりました。
- プロダクション用
- 開発用(dev)
poetry updateはグループを意識せずに更新してくれますが、
poetry addは、どのグループに属するパッケージかを明示的に指定する必要がありました。
そのため、正しくは次のように指定します。
poetry add パッケージ名@latest --group グループ名
まとめ
Poetry プロジェクトを後任としてメンテナンスする場合は、以下のことを理解しておくとトラブルに強くなります。
- パッケージがどのグループ(dev など)に属しているか
poetry updateとpoetry addの挙動の違い
パッケージ更新前に、pyproject.tomlのtool.poetry.groupを事前に確認することを推奨します。
更新方法の整理
- 制約内更新 →
poetry update - 制約外更新 →
poetry add パッケージ名@latest --group グループ名