PyPIにパッケージ公開する手順
ほぼ私的備忘録
前提
- リポジトリが用意されている
- venvで環境が独立できている
リポジトリが用意されている
今回パッケージとして公開するのは以下
今回は素振りのため、浅い階層にEnum継承したシンプルなクラス何個か配置してあるだけの小規模なリポジトリを適当にバージョン0台で出すことにした。
ライセンスを決める
今回はMITにした。
テンプレートはここからコピペして、西暦やコピーライトホルダーのみ書き換えてプロジェクトルートの LICENSE.txt
に配置した。
他のライセンスを検討する場合は以下が参考になる(商用利用の可否や保証の有無、コピーレフトの適用など一覧表があってわかりやすい)
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 commands
は setuptools
によって拡張されたものである
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.cfg
は setup.py
のコマンドのデフォルトオプションを含むファイル
ここでの設定値はASTレベルで解釈(モジュールのコードを実行しないで解釈)されたりする利点がある。
2020年5月リリースの setuptools-46.4.0
以降は今まで setup()
で指定した項目の多くが setup.cfg
で指定できるようになっている
以下の記事が詳しい
パッケージのビルド
wheel
をインストールしてビルドを行う
pip install wheel
python setup.py sdist
Wheelパッケージを以下のコマンドでビルド
python setup.py bdist_wheel
<パッケージ名>.egg-info
や build
, dist
などといったディレクトリができるが、これらはGitの管理下に置く必要はないので .gitignore
で無視するようにしておく
著名な様々な.gitignoreを配布しているリポジトリがあるが、以下だと上記一式に対応しているので便利
PyPIでのパッケージ公開
PyPIへの登録
本番
テスト環境
ここで作成したアカウントを設定ファイルで用いる(次節)
.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/
以下の通り登録できた。
この記事だと依存パッケージの管理など肝心な部分に触れてられていないので、その他のパッケージ公開のプラクティスとまとめて別記事に残す予定
Discussion