PyPI,SphinxでのOSS公開をDockerで完結させるためのベストプラクティス

PyPIにライブラリを公開する説明記事は数多くあるが,意外とDockerでそのuploadをどうやって完結させるか書いてある記事は少ない. なので,この記事では,PyPIへのライブラリの登録 -> Sphinxでドキュメントの登録までの流れをいかにしてDockerでこなすかについて書く.

PyPIへのライブラリの登録 -> Sphinxでドキュメントの登録までの流れに関しては,以下のサイトを参考にした.
【PyPI 】Pythonの自作ライブラリをpipに公開する方法

このサイトでカバーされていないトピックに関しては,

が挙げられる.

さて,これらを踏まえた上で(大体の流れが分かっていれば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上で作業していこうぜ,というお話でした.

created by Rinker
¥4,180 (2022/05/18 00:32:08時点 楽天市場調べ-詳細)

コメント

タイトルとURLをコピーしました