PyPIパッケージ公開手順

# はじめに
この記事では、PythonパッケージをPyPIに公開するまでの手順を説明します。
なお、setupスクリプトなどの設定ファイルの記述については、 別記事『[PyPIパッケージ定義ファイル作成方法 - \_\_init\_\_.py setup.py MANIFEST.in の書き方](https://qiita.com/shinichi-takii/items/6d1063e0aa3f79e599f0)』を書きました。こちらも合わせて、ご参照ください。

# PyPI とは
[PyPI](https://pypi.python.org/pypi) は、 **Python Package Index** の略称で、Pythonパッケージ管理システムです。
PyPIに公開されているパッケージは、 `pip` により簡単にインストール・管理できます。
Rubyプログラマなら [RubyGems](https://rubygems.org/) (gem)、PHPプログラマなら [Composer](https://getcomposer.org/)、Perlプログラマなら [CPAN](https://www.cpan.org/) と同じ仕組みといえば分かりやすいかと思います。


# 準備
## PyPIアカウント登録

本番用、テスト用でそれぞれアカウントを登録します。
アカウント名は、あえて本番用・テスト用で変えておくと良いです。
(環境を間違えてログインすることを防げるからです)

1. PyPIアカウント登録フォームから登録します。
    - 本番用 : https://pypi.python.org/pypi?%3Aaction=register_form
    - テスト用 : https://testpypi.python.org/pypi?%3Aaction=register_form

2. 確認メールが届きます。
  記載URLをクリックしてください。
  `Confirm registration` ページが開きます。

3. 注意事項を確認して、 `I agree` をチェックし、 `Confirm` ボタンを押します。

4. これでアカウント登録が完了しました。


## アカウント認証ファイル(.pypirc)作成

Dropboxなどでアカウント情報を同期したいので、ここではシンボリックリンクを使う手順を記載します。

- 任意の場所に `pypirc` ファイルを作成

```ini
[distutils]
index-servers =
  pypi
  testpypi

[pypi]
repository: https://upload.pypi.org/legacy/
username: <本番用アカウント名>
password: <パスワード>

[testpypi]
repository: https://test.pypi.org/legacy/
username: <テスト用アカウント名>
password: <パスワード>
```

- `.pypirc` ファイルのシンボリックリンクを作成

```bash
$ ln -s pypircファイルの絶対パス ~/.pypirc
```


## 公開に必要なツール(wheel/twine)をインストール

- [wheel](https://pypi.python.org/pypi/wheel) : パッケージ作成に必要
- [twine](https://pypi.python.org/pypi/twine) : PyPIへのアップロードに必要

```bash
$ pip install wheel twine
```


# PyPIへの公開手順

## setup.py を作成

別記事『[PyPIパッケージ定義ファイル作成方法 - \_\_init\_\_.py setup.py MANIFEST.in の書き方](https://qiita.com/shinichi-takii/items/6d1063e0aa3f79e599f0)』をご参照ください。


## パッケージ作成

### 前回作成ファイルをクリーンアップ

必須ではありませんが、前回作成したソースコード配布物、パッケージに関するファイルを一度クリーンアップすることをお勧めします。

- `<パッケージ名>.egg-info` ディレクトリ
  ソースコード配布物作成時の中間ファイルが書き出されるディレクトリです。
  `MANIFEST.in` から配布物に含めるファイルを削ったとき、それだけでは反映されず、同ディレクトリのファイルを一度削除してリセットする必要があります。

- `dist` ディレクトリ
  パッケージファイルが書き出されるディレクトリです。
  パッケージファイルは、同ディレクトリに追加作成されます。
  PyPIに不要なファイルをアップロードしてしまわないよう、最初にファイル削除することをお勧めします。

```bash
$ rm -f -r <パッケージ名>.egg-info/* dist/*
```



### ソースコード配布物を作成

```bash
$ python setup.py sdist
```


### ライブラリのパッケージ作成

```bash
$ python setup.py bdist_wheel
```

※ `python setup.py sdist bdist_wheel` とすれば2つ同時に作成できます。


## ライブラリをPyPIにアップロード

いきなり本番アップロードしても良いですが、テスト環境にアップロードして事前チェックすることをお勧めします。
なお、PyPIは、同一バージョン番号で上書きアップロードできませんので、気をつけましょう。

### テスト

- アップロード

```bash
$ twine upload --repository testpypi dist/*
```

- PyPIページでアップロードされたことを確認

```
https://test.pypi.org/project/<パッケージ名>/
```

- パッケージがインストールできることを確認

```bash
$ pip --no-cache-dir install --upgrade --index-url https://test.pypi.org/simple/ <パッケージ名>
```


### 本番アップロード

- アップロード

```bash
$ twine upload --repository pypi dist/*
```

- PyPIページでアップロードされたことを確認

```
https://pypi.org/project/<パッケージ名>/
```

- パッケージがインストールできることを確認

```bash
$ pip --no-cache-dir install --upgrade <パッケージ名>
```


# 注意点

- PyPIへのアップロードには `twine` を使いましょう。
  `python setup.py register`, `python setup.py sdist upload` は非推奨になっています。

- PyPIは、同一バージョン番号で上書きアップロードできません。
  ちょっとした修正でもバージョンを変更しなければならないので、気をつけましょう。
  (PyPIのパッケージ編集ページでファイルを削除したり、プロジェクトそのものを削除しても変わらず、同一バージョンでは上書きできません)


# 関連記事
- [PyPIパッケージ定義ファイル作成方法 - \_\_init\_\_.py setup.py MANIFEST.in の書き方](https://qiita.com/shinichi-takii/items/6d1063e0aa3f79e599f0)

# 参考記事
## Python公式ドキュメント
- [Using TestPyPI](https://packaging.python.org/guides/using-testpypi/)
- [4. ソースコード配布物を作成する](https://docs.python.jp/3/distutils/sourcedist.html)

## Qiita
- [Pythonで作成したライブラリを、PyPIに公開/アップロードする](https://qiita.com/icoxfog417/items/edba14600323df6bf5e0)
- [PyPIにパッケージを登録する方法](https://qiita.com/hisato-kawaji/items/97e33a0e00dfdab7f34e)
- [Python初心者が、PyPIに自作のパッケージを登録しようとしてハマったこと](https://qiita.com/tokyo-noctambulist/items/cafcbd589e39d45d693f)