はじめに
poetry
は Python
のパッケージマネージャとしてデファクトになりつつある(個人的な感想)。
poetry
では、以下の二つのファイルを使って、ライブラリを管理している
-
pyproject.toml
・・・ 使っているPython
やライブラリのバージョンを管理 -
poetry.lock
・・・ 各ライブラリの実際のバージョンや依存関係を管理
poetry.lock
ではライブラリのハッシュ値も持つことで、 poetry install
時のライブラリの探索時間を短くしている。
問題点
poetry.lock
はライブラリごとのハッシュ値を持っているので、インストールする先のOSが異なったりすると、以下のようなエラーになる。
• Installing libclang (12.0.0): Failed
RuntimeError
Retrieved digest for link libclang-12.0.0-2-py2.py3-none-win_amd64.whl(sha256:46414009fcee8375ba64ea6c2c43c5b80a63e3a8b679f4293e00aa605b7265aa) not in poetry.lock metadata ['sha256:3b0585dbdc3f3b372340f1efe7c28bf4a5b658d2fb8dc0544a7ef0d2bef40618', 'sha256:6df2f8a2cb75181e3c1e99e5dfca2fd44bb7f84ed12d5112541e03c10384f306', 'sha256:b828cb52cf3f02fb0e0a8fddb9dece7e2ed006f8b4d54ee811cef0471d414367', 'sha256:275126823c60ab5c9fae6a433cbb6a47e4d1b5f668a985fbd6065553dbc7efcc', 'sha256:fadad3bf5fbab50c996eb151adc58c3a7cbee45a9135060c416be7b640372112']
at /usr/local/lib/python3.8/site-packages/poetry/installation/chooser.py:113 in _get_links
109│
110│ selected_links.append(link)
111│
112│ if links and not selected_links:
→ 113│ raise RuntimeError(
114│ "Retrieved digest for link {}({}) not in poetry.lock metadata {}".format(
115│ link.filename, h, hashes
116│ )
117│ )
poetry.lock
を削除した状態で poetry install
を行うと、上記エラーは発生しなくなるが、
その代わりに各ライブラリの依存関係などをそのタイミングで確認するので、すごく時間がかかる。
解決策
にあるように、 poetry export
をして、 pip install -r
を行えばよい。
ただ、上記のIssueにあるように最後に poetry install
をすると問題は解決しないので、
pip install
までで止めておく必要がある。
poetry export --without-hashes --dev --output poetry-requirements.txt
pip install -r poetry-requirements.txt
上記コマンドの補足として、
-
--without-hashes
は、poetry.lock
で持っているハッシュを出力しないようにするオプション。これをやらないとpoetry install
と同様な問題に陥ってしまう -
--dev
は、dev-dependencies
分も含めるというオプション。通常のpoetry install
では含んでいる部分なので、入れておいた方が良いかも(productionレベルだと不要かも) -
--outout
は出力するファイルを指定するオプション。リダイレクトで保存するより、こっちの方がシンプルで良いかなと。
最後に
あくまでも workaround なので、他に良い方法はいくらでもあるかなと思います。
「これいいよ」というのがあれば、コメント頂けると幸いです。