以前[Pythonのパッケージ周りのベストプラクティスを理解する(2019年現在)]
(https://www.m3tech.blog/entry/python-packaging)を書きました。
この記事では「基本的には pipenvを使えばOK」と書きましたが、意図的に無視していた部分があります。
Poetryです。
Poetryは調べてみたのですが、各種日本語の記事(は一部の英語記事)はざっと読んだ限りでは、Poetryはどうにも了解できないことが多かったからです。そして、現時点ではPoetryよりPipenvの方が知名度が高そうだし、Pipenv自体は十分実用的なので「pipenvを使えばOK」としました。
とは言え、来年にはPoetryが天下をとっているかもしれません。そこで、そのうち書く記事の足がかりとして、あわよくば誰かが教えてくれたらいいなという虫のいい期待を込め、疑問点を列挙したいと思います。
Pipfile の使用はPEPで決まったものではない?
それはどこまで問題でしょうか?
まあPEPで定義されていた方が良いに決まっています。特にパッケージングツールの開発者にとっては。
一方、一般のPythonユーザーにとってPEPで定義されているかは、あまり関係ありません。それより、ツールが使い物になるかどうかが問題です。
(もし)Pipenvが使いづらいというなら、PipfileがPEPであろうがなかろうが関係なく、Pipenvは使いづらいのです。
pyproject.toml
1個でOK ?
Pipenvの setup.py, setup.cfg, Pipfile, Pipfile.lock が、Poetryではpyproject.toml に置き換わるらしいです。
でも、私の理解では 「setup.py, setup.cfg」と「Pipfile, Pipfile.lock」は役割が違うファイルです。前者は公開パッケージとしての情報を定義するファイル(開発者以外の人が使うファイル)、後者は開発者が使うファイルです。異なる役割を1ファイルに書くのが適切なのでしょうか?
(※補足: のちに分かったことですが、Poetry では Pipfile.lock に相当する poetry.lock というファイルを作るらしいです。でも、当時の Poetry の紹介記事で poetry.lock に言及しているものは見当たりませんでした。)
アプリケーションとライブラリの両方に対応する?
また、Poetryはアプリケーションとライブラリの両方にpyproject.toml
で対応できるとしています。
しかし、[Pythonのパッケージ周りのベストプラクティスを理解する(2019年現在)]
(https://www.m3tech.blog/entry/python-packaging)でも書きましたが、アプリケーションとライブラリでは、依存パッケージの管理方法が異なります。
pyproject.toml
1つで上手く行くのでしょうか?
Pipenvはrequirements.txtを置き換えるに過ぎない?
私の理解では、requirements.txtを置き換えたこと自体が一大革命で、かなり本質的な変化です。
Rubyコミュニティでは、速い段階から単なるパッケージ名のリストでは上手くいかないことが理解され、Bundlerが作られていました。
依存関係の解決?
Poetryは依存関係の解決が上手く、Pipenvが失敗するようなケースでも、Poetryは解決できるとうたっています。
でも、それは決定的な優劣なのでしょうか?
多分、依存関係解決の速度と、新しいファイルフォーマット(pyproject.toml
)を採用することは無関係です。なら、Pipenvに、Poetryの依存関係解決のアルゴリズムを移植すれば、Pipenvも同じくらい早くなるはずです。
インストール速度?
PoetryはPipenvよりインストール速度が速いらしいです。公式ページでは速度の記載はなく、あくまで第三者の感想ですが。
これも、依存関係解決と同じで、Pipenvにアルゴリズムを導入すれば良いのではないかと思います。
また、インストールの速さはそんなに重要でしょうか?実環境ではデプロイ時の1回しかインストールをしないし、開発中もせいぜい1時間に1回とか程度しかしないはずです。
(Poetry関係ないけど) 初心者は Pipenv 不要?
Python には依存関係を管理するツールがたくさんあります。 Python も歴史あるプログラミング言語なので仕方ないですが、情報が多すぎて特に初心者は混乱してしまいます。 結局の所、pip、virtualenv (venv) を使えば十分な場合が多いので、まずはこれらの使い方を学習しましょう。
なんか、こういう「初心者はpipで十分」的な意見をよく見ますけど、私は反対です。100%絶対反対ではないが、90%ぐらい反対です。
だってRubyとかJavaなどの他言語では、割と早い段階でBundlerやGradleを紹介してるじゃないですか。ならPythonでも初めから Pipenv / Poetry を使えばいいんじゃないでしょうか?
まあ、なんの説明も教育もなしに Pipenv / Poetry を使わせると
新入社員「Pipfile.lockはGitにコミットしちゃいけないんですよね!?課長がそう言っていました!!僕はあなたより、課長の言うことに従います!!」
(※課長はJava歴は長いがPythonは未経験)
みたいな混乱は発生したりしますが、それはまた別のレイヤーの話だと思います。
まとめ
ありません。