PythonライブラリをPyPIにパッケージング・公開する:setup.pyに別れを告げ、Poetryへ

Python tutorial - IT technology blog
Python tutorial - IT technology blog

「コードの再利用」という名の悩み

プロジェクトを始めたばかりの頃、私はよくロジック処理の関数をツールからツールへとコピー&ペーストしていました。最初は200行程度だった自動化スクリプトも、数ヶ月のメンテナンスを経て2,000行以上に膨れ上がりました。この時点で、requirements.txtによる依存ライブラリの管理は惨劇へと変わり始めました。

新しいPCに移行するたびに、バージョンの競合修正に追われていました。さらに、そのコード群をパッケージ化してpip installでインストールできるようにしようとした時は、挫折しかけました。setup.pyMANIFEST.inの複雑な設定は、本当に大きな障壁でした。

なぜ従来の手法は頭が痛いのか?

Setuptoolsを使った従来の方法でライブラリをパッケージングしようとしたことがあるなら、そのプロセスがいかに断片的であるかをご存知でしょう。

  • 環境構築にrequirements.txtを使用。
  • メタデータの定義にsetup.pyまたはsetup.cfgを使用。
  • READMEやライセンスなどの非技術系ファイルを管理するためだけにMANIFEST.inを使用。
  • ライブラリ間で互換性のないバージョンが要求される「依存関係の地獄(Dependency Hell)」に直面。

アップロード前にsetup.pyのバージョンを更新し忘れるのは、よくあるミスです。その結果、古いバージョンを削除したり、名前を変更したり、バージョンを上げてからアップロードし直したりと、非常に時間をロスすることになります。

現在のソリューション:最適な選択肢はどれか?

Pythonコミュニティは、この混乱を整理するために多くのモダンなツールをリリースしてきました:

  • Flit: 非常に軽量で、シンプルなライブラリに最適。
  • Pipenv: 仮想環境の管理には優れているが、パッケージング機能には制限がある。
  • Poetry: 個人のスクリプトから大規模なエンタープライズシステムまで、あらゆるプロジェクトにおける私の第一の選択肢。

Poetry – すべてを一つの設定ファイルに集約

Poetryはすべてをpyproject.tomlファイルにまとめます。ロックファイルによって依存関係を厳密に管理し、数コマンドだけでPyPIへのビルドと公開をサポートします。

ステップ 1: Poetryを正しくインストールする

システム環境を汚さないために、pip install poetryは使わないでください。代わりに、公式のインストールスクリプトを使用しましょう:

curl -sSL https://install.python-poetry.org | python3 -

インストールが完了したら、poetry --versionと入力して準備ができているか確認してください。

ステップ 2: プロジェクトの初期化

itfromzero-utilsという名前の新しいライブラリを作成するには、以下のコマンドを実行するだけです:

poetry new itfromzero-utils

既存のコードがある場合は、プロジェクトディレクトリでpoetry initコマンドを使用してください。Poetryがメタデータについていくつか質問し、プロフェッショナルなpyproject.tomlファイルを自動的に生成してくれます。

ステップ 3: スマートな依存関係管理

テキストファイルを手動で修正するのはもうやめましょう。requestsライブラリが必要な場合は、次のように入力するだけです:

poetry add requests

Poetryが適切なバージョンを自動的に探し、pyproject.tomlを更新し、poetry.lockファイルを生成します。このロックファイルにより、チームメンバーがインストールした際にも100%同じ環境が再現されることが保証されます。

ステップ 4: コードの記述とテスト

主要な処理関数をitfromzero_utils/ディレクトリに配置しましょう。私の経験上、バージョン管理はpyproject.tomlファイルのみで行うのがベストです。バージョンを素早く上げるには、poetry version patchコマンド(例:0.1.0から0.1.1へ)を使用できます。

隔離された環境でコードを試行するには、以下を使用します:

poetry run python main.py

ステップ 5: ライブラリをPyPIの「本番環境」へ送り出す

まず、PyPIのアカウントが必要です。セキュリティのために、個人のパスワードの代わりにAPIトークンを作成してください。

以下のコマンドでPoetryにトークンを設定します:

poetry config pypi-token.pypi your-api-token-here

最後に、ビルドと公開のすべてのステップを一つにまとめたコマンドを実行します:

poetry publish --build

このコマンドは.whlファイルを生成し、瞬時にPythonの公式リポジトリにアップロードします。

実践的なヒント:PyPIを汚さないために

いきなり正式版を公開しないでください。自由にテストできるサンドボックス環境であるTestPyPIを活用しましょう。

poetry config repositories.testpypi https://test.pypi.org/legacy/
poetry publish -r testpypi --build

パッケージ名が綺麗に表示され、READMEのフォントや表示に問題がないことを確認してから、本番の公開ボタンを押しましょう。

403エラーを避けるための注意点

  • 名前のチェック: ライブラリ名がすでに誰かに使われていないかPyPIで検索してください。
  • Gitignore: 重いビルドファイルをGitHubにプッシュしないよう、常にdist/ディレクトリをignoreしてください。
  • セマンティックバージョニング: メジャー.マイナー.パッチのルールに従ってください。PyPIは非常に厳格で、既存のバージョンに上書きアップロードすることはできません。

Poetryを使用することで、複雑なPythonプロジェクトの管理にかかる時間を大幅に節約できました。かつてはパッケージングを恐れていた私ですが、今では2分足らずで新しいバージョンをリリースできます。もしインストール過程で困ったことがあれば、下のコメント欄で教えてください!

Share: