uvを使ってPyPIテスト環境に公開する手順
Publish date: 2025-01-18
MCPサーバーを見ていると、uvやuvxがよく登場するので使ってみたくなりました。
本記事は、uvを利用してテスト用のPython Package Index(PyPI)にpublishする手順です。
uvのプロジェクトの作成
最初に、uvのコマンドを使ってプロジェクトの環境を作ります。
uv init uv-project-name
cd uv-project-name
uv venv --python 3.10
.venv\Scripts\activate
テストやリンター等で使うパッケージも追加しておきます。
uv add --dev pytest pytest-cov black ruff mypy build twine hatch
後は通常通りpythonでアプリケーションを作成します。 今回は本体のコードはsrc以下に、pytestのテストコードはtestディレクトリに以下に配置しました。
pyproject.toml
は次のような形にしました(最後にGitHubのリンクのせます)。
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "PyPIに公開するパーッケージの名前(package_name)"
version = "バージョンの数字XX.XX.XX形式"
description = "説明文"
readme = "README.md"
requires-python = ">=3.10" # Pythonのバージョン
license = "MIT" # ライセンス
authors = [
{ name = "作成した人の名前"}
]
# 分類の情報
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
]
dependencies = []
[dependency-groups]
dev = [
"black>=24.10.0",
"build>=1.2.2.post1",
"hatch>=1.14.0",
"mypy>=1.14.1",
"pytest>=8.3.4",
"pytest-cov>=6.0.0",
"ruff>=0.9.2",
"twine>=6.0.1",
]
[project.urls]
Homepage = "ホームページのURL"
Repository = "リポジトリのURL"
[project.scripts]
package_name = "package_name:somefunction"
script_name = "package_name:sonmename.anotherfunction"
[tool.pytest.ini_options]
addopts = "-ra -q"
testpaths = ["tests"]
[tool.hatch.build.targets.wheel]
packages = ["src/package_name"]
[tool.black]
line-length = 88
target-version = ['py310']
include = '\.pyi?$'
[tool.ruff]
select = ["E", "F", "I", "N"]
line-length = 88
target-version = "py310"
[tool.mypy]
python_version = "3.10"
strict = true
動作確認とテスト
コードが正しくかけていれば以下で動作確認ができます。
python -m package_name
uv run path\to\python_file.py
pytestも次で動かせます。
uv run pytest
uv run pytest --cov=package_name tests/
buildとPublish
uv build
するとdistディレクトリにファイルが生成されます。
uv publish
でPython Package Index(PyPI)に公開されます。
uv build
uv publish --publish-url https://test.pypi.org/legacy/ --token pypi-YOUR-TEST-TOKEN
--publish-url https://test.pypi.org/legacy/
はテスト用の場合に必要です。
tokenは管理画面から発行できます。
公開したライブラリの利用
pip、uv addでインストール
--index-url https://test.pypi.org/simple/
を付ける事で、テスト環境からインストールできます。
uv pip install --index-url https://test.pypi.org/simple/ project_name
uv add project_name --index-url https://test.pypi.org/simple/
uvxの利用
[project.scripts]で指定した名前でuvxから呼び出せます。
公開するプロジェクト名と同じにすると省略できます。
つまり、以下のような形で使えます。
[project.scripts]
package_name = "package_name:somefunction"
script_name = "package_name:sonmename.anotherfunction"
↓
uvx --index-url https://test.pypi.org/simple/ package_name
uvx --index-url https://test.pypi.org/simple/ --from package_name script_name
開発時はuv run
で実行できます。
uv run package_name
uv run script_name
実際のコードとプロジェクト
参考ページ
- Publishing a package | uv
- uvでPythonパッケージを公開する | rio.st
- uvx(やpipx)により、Python製CLIツールも開発者による仮想環境管理が不要になってるじゃん! Sphinxを例に - nikkie-ftnextの日記
- Packaging Python Projects - Python Packaging User Guide
メモ
本物のPython Package Index(PyPI)はURLを除去することで、同じ手順で実施できます。
uv publish --token pypi-YOUR-TEST-TOKEN
uv pip install project_name
uv add project_name
uvx package_name
uvx package_name script_name