2016-01-06

Python初心者がPyPIにコマンドラインツールを登録してみた

ExactTargetのCLIを仕事の便利ツール的な感じで作っていたのをPyPIに公開してみました。↓

et-cli Python Package Index

$ pip install et-cli

でインストールできるようになってますので、ExactTarget導入している開発者の方は良ければお使いください(日本ではほとんど居ないと思いますが…)。ツールの説明は別の記事として書こうと思います。まだまだ機能不全+クソコードな感じなのでもうちょい時間作って書いていかないとなー。

ということで、今回はコマンドラインツールをPyPIにパッケージ登録するやり方を書いていきます。

全体的な流れはこんな感じです。

  1. ディレクトリ構成決める
  2. setup.py作成
  3. testpypiにregister&sdist upload
  4. 本番pypiにregister & sdist upload
参考URLはこちら↓(以下を読んでから進めたほうがPyPIやパッケージに関する理解が進むので効率良いです!)

ディレクトリ構成と各ファイルの説明

完成形はこんな感じ↓
.
├── LICENSE
├── MANIFEST.in
├── README.rst
├── bin
│   ├── et
│   └── et.cmd
├── etcli
│   ├── __init__.py
│   └── utils.py
└── setup.py

setup.pyの作成

setup.pyはこんな感じです
from setuptools import setup

with open('README.rst') as f:
    readme = f.read()

setup(
    name="et-cli",
    version="0.0.4",
    packages=['etcli'],
    description='ExactTarget CLI Tool',
    long_description=readme,
    url='https://github.com/****',
    author='****',
    author_email='****',
    license='MIT',
    scripts=['bin/et', 'bin/et.cmd'],
    install_requires=[
        'FuelSDK',
    ],
)

packagesはパッケージとして設定するディレクトリを設定します。これによってpip installでパッケージがローカルにインストールされてimportできるようになります。

long_descriptionはPyPIに表示される説明文です。

コマンドラインツールを登録する場合に必要なのがscriptsの設定になります。ここで指定したスクリプトファイルがpip installでbinディレクトリに格納されることになります。

console_scriptsを使う方法に関してはこちらを参照→Command Line Scripts — Python Packaging Tutorial

ローカルで開発、インストール

pipコマンドはローカルのプロジェクトやgithubに上がっているプロジェクトをインストールすることができます。

ローカルのプロジェクトをインストールする場合↓

$ pip install -e {local project path}

githubに上がっているプロジェクトをインストールする場合↓

$ pip install git+https://github.com/tzmfreedom/hoge.git

これらのコマンドとvirutualenv等の仮想環境を使って、依存関係が通ってちゃんとインストール出来るかどうかの検証、テストが出来ます。

testpypiでPyPIへの登録テスト

本番のPyPIに登録する前に、登録に必要なファイル、記載が不足していないかどうか、ちゃんとPyPIに上げれるようになっているかどうかを確認するためのtest用のPyPIリポジトリがあります。

まず、testpypiにアクセスしてユーザ登録を行います。

次にホームディレクトリに.pypircファイルを以下の内容で作成します。

[distutils]
index-servers =
    pypi
    pypitest

[pypi]
username:{username}
password:{password}

[pypitest]
repository: https://testpypi.python.org/pypi
username:{username}
password:{password}

[pypi]の方は本番用のPyPIアカウント、pypitestの方はtestpypiで作成したアカウントの情報を入力します。

メタデータの登録及びパッケージの中身のアップロードは以下のコマンドで実施します。

$ python setup.py register -r https://testpypi.python.org/pypi
$ python setup.py sdist upload -r https://testpypi.python.org/pypi

これでtestpypiにパッケージが登録され、以下のコマンドでインストールができます。

$ pip install --index https://testpypi.python.org/pypi {package-name}

が、上記コマンドの場合は依存関係にあるパッケージもtestpypiにある必要があるのでインストールに失敗する場合があります。なのでメタデータがちゃんと登録できているか、ソース配布物がちゃんとアップロードされているかの確認がtestpypiの主な目的になります。

本番PyPIへの登録

-rオプションをつけなければ本番PyPIに登録しにいきます。本番PyPIのアカウント登録も忘れずに。
$ python setup.py register
$ python setup.py sdist upload

その他

ちなみに、一度パッケージ名を登録したら、そのパッケージ名を削除することは出来ないようです。厳密にはパッケージを削除すると外部から見れなくなりますが、再度同一パッケージ名でアップロードすると以前の履歴が残った状態で復活します。こんな感じでremoveも履歴として残っちゃいます↓

pypi_journal

また、ファイルも履歴として残されるので、「バージョン0.0.1で間違ってファイルあげちゃったのでパッケージ削除して修正したファイルをバージョン0.0.1で再度アップロードしたい」とか思っても、0.0.1のファイルアップロード履歴が残り、ファイル名重複が起こるので、バージョンを上げないとアップロードできなくなります。まぁ本番PyPIに上げる前にテストしていれば基本的には問題ないんですが…。

また、PyPIに登録するコマンドラインツールを書くときはAWS CLIが非常に参考になるので、ざっと設定周りのコードを読むことをオススメします。

このエントリーをはてなブックマークに追加