プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

uvでpipインストール可能な配布形式を作成する

前回、uvを使ったPython開発プロジェクトのセットアップ事例を紹介しました。

architecting.hateblo.jp

今回は開発したPythonコードをuvを使ってpipインストール可能な配布形式にします。

ちなみに昔、PyCharmとsetup.pyを使って作成する方法を紹介したことがあります。

architecting.hateblo.jp

今回の紹介する方法は前回よりも更にお手軽です。


前提

今回の記事は前回の続きですので、以下のことが前提になっています。

  • uv initでプロジェクトを初期化している
  • uv addでパッケージを追加している
  • コードはsrc/ディレクトリ配下にある
  • エントリポイントはmypkg.mymodule.pyの中のmain関数(名前は自由に変更してOKです)
<プロジェクト名>/
 ├── src/
 │   └── mypkg
 │       ├── __init__.py
 │       └── mymodule.py
 └── pyproject.toml

詳しく知りたい方は前回の記事を確認してください。

なお前回のプロジェクトセットアップ作業はPyCharmが前提でしたが、今回の作業ではPyCharmは使いません。 どのIDEでも結構です。


pyproject.tomlを編集

uvを使っていれば、既にpyproject.tomlが生成されていて、uv addで追加したパッケージが依存関係として記載されているはずです。 このpyproject.tomlに2点だけ追記します。 面倒に聞こええますが、ほぼコピペでOKですのでがんばりましょう。

1つはtools.setuptools.package-dirにSources Root(src/ディレクトリ)を指定することです。 ディレクトリ構成が上記の前提と同じなら下記サンプルのコピペでOKです。

[tool.setuptools]
package-dir = {"" = "src"}

これを記載するとビルド時に自動的にsrc/ディレクトリをsys.pathに入れるてくれるようです。

2つ目はproject.scriptsでエントリーポイントを指定することです。 下記サンプルの2行目は自分のコードのパッケージ名、モジュール名、関数名に合わせて変更してください。

[project.scripts]
mycommand = "mypkg.mymodule:main"

上のように記述すると、% mycommandを実行したとき、以下の内容と同等の処理が実施されます。

import sys
from mypkg.mymodule import main
sys.exit(main())

なおエントリポイントの指定方法は開発しているコードの種類によって異なります。

  • CLIスクリプトのエントリポイント:project.scripts(今回の例)
  • GUIアプリのエントリポイント:project.gui-scripts
  • プラグインのエントリポイント:project.entry-points

動作確認

試験的にpipインストールして動作を確認します。

uv pip install -e .
mycommand

課題があれば修正・動作確認を繰り返します。 コードを修正するとすぐにmycommandの動作に反映されるので、コード修正の都度、再インストールする必要はありません。

完成したら削除します。

uv pip uninstall .

ビルド

いよいよビルドします。

uv build .

dist/ディレクトリにtar.gzとwhlの2つのファイルが作成されます。

  • tar.gzはsdist形式と呼ばれ、ソースが含まれており、pipインストール時にコンパイルされます
  • whlはwheel形式と呼ばれ、コンパイル済みのバイナリが含まれており、sdistより一般的な配布形式ですが、プラットフォームが異なるとエラーが発生しやすいです

どちらもpipインストール可能なファイルです。 pip installuv addでインストールしてください。


公開

uvではuv publishで作成したパッケージをpypiなどの公開サイトにアップロード可能です。

公式サイトに公開する場合はもうちょっとpyproject.tomlの内容をブラッシュアップした方がよいでしょう。 project.descriptionを書いたり、バージョン番号を管理してproject.versionに付与したり、色々あるのでパッケージ公開に興味がある方は調べてみてください。

ですが、ちょっとパッケージ化したいだけなら今回の方法で問題ないと思います。