📦

PyPIにパッケージ公開する手順

2022/10/08に公開

ほぼ私的備忘録

前提

  • リポジトリが用意されている
  • venvで環境が独立できている

リポジトリが用意されている

今回パッケージとして公開するのは以下

https://github.com/BoatraceRepository/boatrace.models

今回は素振りのため、浅い階層にEnum継承したシンプルなクラス何個か配置してあるだけの小規模なリポジトリを適当にバージョン0台で出すことにした。

ライセンスを決める

今回はMITにした。

テンプレートはここからコピペして、西暦やコピーライトホルダーのみ書き換えてプロジェクトルートの LICENSE.txt に配置した。
https://opensource.org/licenses/MIT

他のライセンスを検討する場合は以下が参考になる(商用利用の可否や保証の有無、コピーレフトの適用など一覧表があってわかりやすい)
https://future-architect.github.io/articles/20200821/#主要なライセンス

setup.py を追加

配布したいパッケージのルートディレクトリには setup.py を追加する必要がある

普段使っている pip はパッケージをインストールするためのツールであり、これとは別にパッケージングと配布のためのツールが必要になる。
setup.py はそういったパッケージングとデリバリーを行うツールのメタデータを定義する場所であり、PyPIの登録に必要な設定を記述したり、その内容をもとにソース配布物の作成を行なったりする

ガイドでも最も重要なファイルとされている。

The most important file is setup.py which exists at the root of your project directory.
https://packaging.python.org/en/latest/guides/distributing-packages-using-setuptools/?highlight=setup.py#setup-py

ミニマルに作ると以下

from setuptools import setup

setup(
    name="boatrace.models",
)

具体的には冒頭でインポートしている setuptools が前述したパッケージングと配布のためのツールに相当する
(同種の標準ライブラリとして distutils があるが、より高機能な setuptools の使用が推奨されているらしい)

setup.py はパッケージングタスクのCUIを備えているが、上記のようにファイルを設定したらそのうちいくつかのコマンドが使えるようになる。

以下でヘルプを出力できる

$ python setup.py --help-commands

これらのうち Extra commandssetuptools によって拡張されたものである

check っていうコマンドがあったので早速打ってみると、

$ python setup.py check
running check
warning: check: missing required meta-data: version, url

warning: check: missing meta-data: either (author and author_email) or (maintainer and maintainer_email) should be supplied

こういうふうに足りない項目を指摘してくれる。

既に記述したnameやここで表示されたversionやurl以外にも必要なディレクティブはいくつかあり、主要なものは下表の通りである

項目 概要
description 1行程度の短い説明
long_description パッケージの完全な説明
long_description_content_type 前項に適用するMIMEタイプ
author 作者名
author_email 問い合わせ先のメールアドレス
url プロジェクトのURL
license ライセンス情報
packages パッケージとなる名前空間の指定
namespace_packages 名前空間パッケージの一覧
install_requires 依存パッケージ

こういった項目を setup.py にハードコードするのは面倒
一般的なプロジェクト構成ならプロジェクトに点在する他のソースコードや設定ファイルなどから取得できる(例えば、long_description の内容はは READMEファイルから取得できる)項目もあるので、そういったものは動的に取得して設定に反映させた方がいい

setup.cfg の追加

setup.cfgsetup.py のコマンドのデフォルトオプションを含むファイル

ここでの設定値はASTレベルで解釈(モジュールのコードを実行しないで解釈)されたりする利点がある。

2020年5月リリースの setuptools-46.4.0 以降は今まで setup() で指定した項目の多くが setup.cfg で指定できるようになっている

以下の記事が詳しい
https://setuptools.pypa.io/en/latest/userguide/declarative_config.html

パッケージのビルド

wheel をインストールしてビルドを行う

pip install wheel
python setup.py sdist

Wheelパッケージを以下のコマンドでビルド

python setup.py bdist_wheel

<パッケージ名>.egg-infobuild, dist などといったディレクトリができるが、これらはGitの管理下に置く必要はないので .gitignore で無視するようにしておく

著名な様々な.gitignoreを配布しているリポジトリがあるが、以下だと上記一式に対応しているので便利
https://github.com/github/gitignore/blob/main/Python.gitignore

PyPIでのパッケージ公開

PyPIへの登録

本番
https://pypi.org/

テスト環境
https://test.pypi.org/

ここで作成したアカウントを設定ファイルで用いる(次節)

.pypirc

リポジトリ情報の設定ファイルを作成する

$ vim ~/.pypirc
[distutils]
index-servers =
  pypi
  pypitest

[pypi]
repository: https://upload.pypi.org/legacy/
username: <username>
password: <password>

[pypitest]
repository: https://test.pypi.org/legacy/
username: <username>
password: <password>

アップロード実行

以前は setup.py が提供する upload コマンドが使われていたが、現在は twine を使うことが推奨されている。
twine は、PyPIに安全にパッケージをアップロードするためのユーティリティ

以下の通りインストールとアップロードが実行できる

pip install twine
# テスト環境へのアップロード
twine upload --repository pypitest dist/* 
# 本番へのアップロード
twine upload --repository pypi dist/*

アップロードが成功すると以下のようにパッケージのURLが返ってくる

View at:
https://test.pypi.org/project/boatrace.models/0.0.1/

以下の通り登録できた。

https://pypi.org/project/boatrace.models/

この記事だと依存パッケージの管理など肝心な部分に触れてられていないので、その他のパッケージ公開のプラクティスとまとめて別記事に残す予定

Discussion