[python] pypiへのライブラリ公開手順

Pythonのライブラリをリリースしたのでその時の手順を簡単にまとめてみました。

パッケージの公開手順に焦点を当てたいので、今回はパッケージのインストール時に必要なファイルの準備は省略します。

アカウント登録

パッケージの公開には、pypiのアカウントが必要になるのアカウントを取得します。
また、pypiにはテスト用に利用できるアカウントも存在するので、合わせてそちらも取得しておくと良いでしょう。

っていうか、初めてパッケージ公開するときはまずどこかで失敗するので、いきなり本番環境は怖いですよね…
事実、私も少し失敗しました。

アカウントの作成はそれぞれ以下からできます。
pypiアカウント作成 testpypiアカウント作成

.pypirc

アカウントの作成が完了したら、ホームディレクトリに.pypircファイルを作成しましょう。
中には、pypiアカウントのユーザ名とパスワードを記述します。

[distutils]
index-servers =
  pypi
  testpypi

[pypi]
repository: https://upload.pypi.org/legacy/
username: ユーザー名
password: パスワード

[testpypi]
repository: https://test.pypi.org/legacy/
username: ユーザ名
password: パスワード

それぞれテスト用のアカウントと本番用のアカウントを記述しておきます。

実は、このファイル自体は、作成しなくても問題はないようですが、作成しておくことでパッケージのアップロードの度、ユーザー名やパスワードを聞かれなくて済むようになるので作っておいた方が良いでしょう。

パッケージ化

自分で作成した、ライブラリをパッケージ化します。

python setup.py sdist

distディレクトリ以下に、パッケージ化されたファイルが作成されます。
パッケージ名-バージョン名.tar.gzというファイル名になると思います。

ビルト済みパッケージ

Cのファイルを内包していたりするパッケージは、事前にビルド済みのパッケージを配布することで、「ユーザー側でビルドが通らない」といった自体を抑制できます。

ビルド済みパッケージを配布するのには、別途パッケージが必要になるのでインストールします。

pip install wheel

インストールが完了したら、以下のコマンドが実行できるようになります。

python setup.py bdist_wheel

先ほどのコマンドと同様に、distディレクトリ以下に、ビルドされたファイルが作成されます。
パッケージ名-バージョン名.ビルド環境.whlというファイル名になると思います。

この時、パッケージ名やバージョンの命名の仕方に問題があると、うまく実行できないので何か問題が起きたら、パッケージ名やバージョン番号に問題がないか確認してみましょう。

問題があるの以下のような感じで、ファイル名をノーマライズしろとの警告が出ます。

/Users/username/.pyenv/versions/3.7.1/lib/python3.7/site-packages/setuptools/dist.py:397:
UserWarning: Normalizing '0.0.Dev' to '0.0.dev0'
  normalized_version,
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: setup.py --help [cmd1 cmd2 ...]
   or: setup.py --help-commands
   or: setup.py cmd --help

error: invalid command 'bdist_wheel'

この時自分が、遭遇したのがバージョン名の最後は必ず数字にすること、バージョン名に含まれるアルファベットは小文字にすることと言うような警告でした。

パッケージの公開

パッケージ公開用のライブラリの導入

pip install twine

これでtwineコマンドが使えるようになります。
一応

twine --version

でインストールできているか確認しましょう。

twine version 1.13.0 (pkginfo: 1.5.0.1, requests: 2.21.0, setuptools: 39.0.1,
requests-toolbelt: 0.9.1, tqdm: 4.31.1)

試験公開

まずは、test.pypi.orgにパッケージを公開してみましょう。

twine upload --repository testpypi dist/*

このコマンドを実行すれば、自動的にパッケージを公開してくれるのでアップロードされるのを待ちましょう。

完了したら、test.pypiのアカウントのマイページに公開したパッケージがあるか確認しましょう。

きちんと公開できていれば、問題ないので続いて本番環境へアップロードしてみましょう。

もし、アップロードで何かエラーが出た場合は

twine check dist/*

を実行してみましょう。

パッケージの書き方に問題があれば教えてくれます。

テスト環境からインストール

テスト環境にアップロードしたパッケージをインストルするには以下のように--index-urlオプションを指定します。

pip install --index-url https://test.pypi.org/simple/ パッケージ名

pypiへ公開

先ほどの試験公開が成功していれば、同様の手順を踏むだけですので

twine upload --repository pypi dist/*

を実行しましょう。

アップロードが完了したら、pipを使ってインストールできるか確かめてみましょう。

pip install パッケージ名

最後に

pythonのパッケージの公開はかなり簡単にできるので、皆さんもどんどん便利なパッケージを作って公開してみてください。