PyPIにライブラリを公開する説明記事は数多くあるが,意外とDockerでそのuploadをどうやって完結させるか書いてある記事は少ない. なので,この記事では,PyPIへのライブラリの登録 -> Sphinxでドキュメントの登録までの流れをいかにしてDockerでこなすかについて書く.
PyPIへのライブラリの登録 -> Sphinxでドキュメントの登録までの流れに関しては,以下のサイトを参考にした.
・【PyPI 】Pythonの自作ライブラリをpipに公開する方法
このサイトでカバーされていないトピックに関しては,
pip install -e .
でpipのテストを出来ること.- __version__の記法に関してはこのサイトの方法だと,dependenciesの問題が発生するので以下のサイトを参考にすること.
・__version__の罠とベストプラクティス - pip installでdependenciesまでインストールする方法に関しては,以下のページを参照のこと.
・[PyPI] pipで依存パッケージをインストールさせる,OSS開発者向け - type annotationをsphinxのdocumentに反映させる方法.
・sphinx-autodoc-typehints 1.17.0
が挙げられる.
さて,これらを踏まえた上で(大体の流れが分かっていればok),Dockerで完結するPyPIへのアップロード方法を見ていこう.
Motivation
そもそもこの記事を書くに至った理由を幾つか述べていこう.
・twineでPyPIにパッケージを上げる際にはtwineコマンドを打つ環境で,パッケージが動かなければいけない.だが,そのためには環境構築の手間を省いたDocker上でPyPIへのuploadを終わらせなければいけない.
・Dockerを用いれば,dependencies関係のinstallの確認が非常に楽になる.Dockerのコンテナを消して,再度作ればdependenciesが入っていない環境まで即座に戻してテストが可能.
また,この記事の中ではOSSのパッケージ作成段階でのtipsもカバーする.
本記事で紹介した内容で出来たOSSはpy_simple_reportというものだ.参考にどうぞ.
開発フェーズ
実際にOSSのコードを書く際にパッケージの挙動を確認するために,一々,test.pypi.orgにuploadするのは馬鹿らしいし,かといってパッケージのdirectoryに入ってコードを操作すると,__init__.py段階でのバグに対応出来ない.
そこで以下のの工夫を実施している.
- OSSのプロジェクト内に
test_dir
ディレクトリーを作成し,.gitignoreで除外設定をしておく. - 以下のコードを書くことによって,パッケージをimportする.この方法の良いところは,pypiに送り込むOSSの部分のディレクトリーを汚さず,かつ,Dockerfileを用いた環境でjupyterを開き作業を行える点だ.
import sys sys.path.append("..") # example package. import py_simple_report as sim_repo
- ファイルの変更をjupyterを再起動せずに読み込ませるためのコマンドを書く.
%load_ext autoreload %autoreload 2
これでDocker環境でテストが行え,かつ,OSS部分のファイルを頻繁にいじっても即座に変更を反映させて作業を進めることが可能となる.
Dockerfileの準備
PyPIへのuploadとSphinxへのドキュメント作成のために以下のコードをDockerfileにプラスで記述する.
RUN pip install twine && \ pip install wheel RUN pip install sphinx && \ pip install sphinx_rtd_theme && \ pip install sphinx-autodoc-typehints && \ pip install nbsphinx
もし,OSSのDockerfileをユーザーに使ってもらう想定ならば,Dockerfile-devを用意してDockerfileをベースに追加の読み込み部分をDockerfile-devに記述すれば良い.
PyPIへのuploadとsphinxの準備
ここまで来たらPyPIに必要なファイル,sphinxに必要なファイルを準備した後に,Dockerで開いたjupyter上のターミナルにおいて,
・python setup.py sdist
・twine upload --repository pypi dist/*
・sphinx-build ./docs_src ./docs
を実行していけば良い.
もし,dependenciesのinstallを確認したければ,一回containerを潰して,再度立ち上げた状態で,pip install -e .
などを押して正しくパッケージがインストール出来るか確認すれば良い.
———-雑感(`・ω・´)———-
作業しているときはもっと書くことありそうな感じしたけど,文字にしてみると物凄いsimpleだった.結局はDocker上で作業していこうぜ,というお話でした.
コメント