mcpField
P
python-pypi-package-builder

python-pypi-package-builder

github.com/github開発40.5k946 回インストール今日更新
リポジトリ

python-pypi-package-builder について

python-pypi-package-builderは、Pythonパッケージの設計、テスト、PyPI公開をAIエージェント向けに案内するスキルです。構成、ビルドバックエンド、バージョン管理、品質確認、リリース手順を扱い、構成生成スクリプトも備えています。

主な機能

  1. 01パッケージ種別と構成の選択
  2. 02Pythonビルドバックエンドの比較
  3. 03テスト、Lint、型チェックの設定
  4. 04バージョン管理とリリース手順の計画
  5. 05スクリプトによるパッケージ構成の生成

活用シーン

  1. 01pipで導入できるPythonライブラリの作成
  2. 02pyproject.tomlとパッケージツールの設定
  3. 03CIとPyPI公開の準備
  4. 04既存Pythonパッケージのモダン化

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/github/awesome-copilot --skill python-pypi-package-builder

インストール後、Claude Code で/python-pypi-package-builderを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
architecture-patterns.md
ci-publishing.md
community-docs.md
library-patterns.md
pyproject-toml.md
release-governance.md
testing-quality.md
tooling-ruff.md
versioning-strategy.md
scripts/
scaffold.py

詳細

Python PyPI パッケージビルダー スキル

本番環境で使える Python ライブラリを構築し、テスト、リント、バージョン管理、型付けを行い、PyPI に公開するための、完全で実戦で検証済みのガイドです。最初のコミットからコミュニティに公開できるリリースまでを網羅します。

AI エージェントへの指示: コードを1行でも書いたり、ファイルを作成したりする前に、このファイル全体を読んでください。レイアウト、バックエンド、バージョン管理戦略、パターン、CI など、すべての判断基準がここにあります。決定ツリーに沿って順番に進めてください。このスキルは、あらゆる種類の Python パッケージ(ユーティリティ、SDK、CLI、プラグイン、データライブラリ)に適用されます。セクションを省略しないでください。


クイックナビゲーション

このファイルのセクション内容
1. スキルの適用条件このスキルを読み込むタイミング
2. パッケージの種類の判断構築するものを特定する
3. フォルダー構成の判断src/、フラット構成、モノレポの比較
4. ビルドバックエンドの判断setuptools / hatchling / flit / poetry
5. PyPA パッケージングの流れ標準的な公開パイプライン
6. プロジェクト構成テンプレート各選択肢の完全な構成
7. バージョン管理戦略PEP 440、semver、動的管理と静的管理
リファレンスファイル内容
references/pyproject-toml.md4種類すべてのバックエンドのテンプレート、setuptools_scm、py.typed、ツール設定
references/library-patterns.mdOOP/SOLID、型ヒント、コアクラスの設計、ファクトリー、プロトコル、CLI
references/testing-quality.mdconftest.py、ユニットテスト/バックエンドテスト/非同期テスト、ruff/mypy/pre-commit
references/ci-publishing.mdci.yml、publish.yml、Trusted Publishing、TestPyPI、CHANGELOG、リリースチェックリスト
references/community-docs.mdREADME、docstring、CONTRIBUTING、SECURITY、アンチパターン、総合チェックリスト
references/architecture-patterns.mdバックエンドシステム(プラグイン/ストラテジー)、設定レイヤー、トランスポートレイヤー、CLI、バックエンドの注入
references/versioning-strategy.mdPEP 440、SemVer、プレリリース、setuptools_scm の詳細、flit の静的管理、判断エンジン
references/release-governance.mdブランチ戦略、ブランチ保護、OIDC、タグ作成者の検証、無効なタグの防止
references/tooling-ruff.mdRuff のみを使う設定(black/isort の代替)、mypy の設定、pre-commit、asyncio_mode=auto

スキャフォールドスクリプト: python skills/python-pypi-package-builder/scripts/scaffold.py --name your-package-name を実行すると、ディレクトリ構成全体、スタブファイル、pyproject.toml を1つのコマンドで生成できます。


1. スキルの適用条件

ユーザーが次のことを求めたときは、このスキルを読み込んでください。

  • Python パッケージまたはライブラリを作成、スキャフォールド、または PyPI に公開する
  • pip でインストールできる SDK、ユーティリティ、CLI ツール、またはフレームワーク拡張を構築する
  • Python プロジェクトの pyproject.toml、リント、mypy、pre-commit、または GitHub Actions を設定する
  • バージョン管理(setuptools_scm、PEP 440、semver、静的バージョン管理)について理解する
  • PyPA 仕様(py.typed、MANIFEST.in、RECORD、分類子)について理解する
  • Trusted Publishing(OIDC)または API トークンを使って PyPI に公開する
  • 既存のパッケージをリファクタリングし、最新の Python パッケージング標準に準拠させる
  • Python ライブラリに型ヒント、プロトコル、ABC、またはデータクラスを追加する
  • Python パッケージに OOP/SOLID の設計パターンを適用する
  • ビルドバックエンド(setuptools、hatchling、flit、poetry)から選択する

次のような表現がある場合も適用します: 「Python SDK を構築する」、「ライブラリを公開する」、「PyPI CI を設定する」、「pip パッケージを作成する」、「PyPI に公開する方法」、「pyproject.toml の相談」、「PEP 561 の型付け」、「setuptools_scm のバージョン」、「Python の semver」、「PEP 440」、「git タグでリリース」、「Trusted Publishing」。


2. パッケージの種類の判断

コードを書く前に、ユーザーが何を構築するのかを特定してください。種類ごとに異なるパターンがあります。

判断表
種類中核となるパターンエントリーポイント主な依存関係パッケージの例
ユーティリティライブラリ純粋関数とヘルパーのモジュールAPI のインポートのみ最小限arrow、humanize、boltons、more-itertools
API クライアント/SDKメソッド、認証、リトライロジックを備えたクラスAPI のインポートのみhttpx または requestsboto3、stripe-python、openai
CLI ツールコマンド関数と引数パーサー[project.scripts] または [project.entry-points]click または typerblack、ruff、httpie、rich
フレームワークプラグインプラグインクラス、フックの登録[project.entry-points."framework.plugin"]フレームワークの依存関係pytest-*、django-*、flask-*
データ処理ライブラリクラスと関数型パイプラインAPI のインポートのみオプション:numpy、pandaspydantic、marshmallow、cerberus
混合型/汎用型上記の組み合わせさまざまさまざま多数の実際のパッケージ

判断ルール: 不明な場合はユーザーに確認してください。パッケージは複数の種類を組み合わせることがあります(例:CLI エントリーポイントを備えた SDK)。構造を決める際は主な種類を適用し、追加の種類のパターンを重ねてください。

各種類の実装パターンについては、references/library-patterns.md を参照してください。

パッケージの命名規則
  • PyPI 名:すべて小文字で、ハイフンを使用します — my-python-library
  • Python のインポート名:アンダースコアを使用します — my_python_library
  • 利用可能か確認してください:着手前に https://pypi.org/search/ を確認します
  • 人気のパッケージとの名前の衝突を避けてください(まず pip install <name> が失敗することを確認します)

3. フォルダー構成の決定

判断ツリー
Does the package have 5+ internal modules OR multiple contributors OR complex sub-packages?
├── YES → Use src/ layout
│         Reason: prevents accidental import of uninstalled code during development;
│         separates source from project root files; PyPA-recommended for large projects.
│
├── NO → Is it a single-module, focused package (e.g., one file + helpers)?
│         ├── YES → Use flat layout
│         └── NO (medium complexity) → Use flat layout, migrate to src/ if it grows
│
└── Is it multiple related packages under one namespace (e.g., myorg.http, myorg.db)?
          └── YES → Use namespace/monorepo layout
ルールの概要
状況使用する構成
新規プロジェクトで、将来の規模が不明src/ レイアウト(最も安全なデフォルト)
単一目的で、モジュールが1~4個フラットレイアウト
大規模なライブラリで、貢献者が多いsrc/ レイアウト
1つのリポジトリに複数のパッケージがある名前空間/モノレポ
古いフラット構成のプロジェクトを移行するフラット構成を維持し、次のメジャーバージョンで src/ に移行

4. ビルドバックエンドの決定

判断ツリー
Does the user need version derived automatically from git tags?
├── YES → Use setuptools + setuptools_scm
│         (git tag v1.0.0 → that IS your release workflow)
│
└── NO → Does the user want an all-in-one tool (deps + build + publish)?
          ├── YES → Use poetry (v2+ supports standard [project] table)
          │
          └── NO → Is the package pure Python with no C extensions?
                    ├── YES, minimal config preferred → Use flit
                    │   (zero config, auto-discovers version from __version__)
                    │
                    └── YES, modern & fast preferred → Use hatchling
                        (zero-config, plugin system, no setup.py needed)

Does the package have C/Cython/Fortran extensions?
└── YES → MUST use setuptools (only backend with full native extension support)
バックエンドの比較
バックエンドバージョンの取得元設定C 拡張最適な用途
setuptools + setuptools_scmgit タグ(自動)pyproject.toml + オプションの setup.py シム対応git タグでリリースするプロジェクト。あらゆる複雑さに対応
hatchling手動またはプラグインpyproject.toml のみ非対応新しい純粋 Python プロジェクト。高速でモダン
flit__init__.py の __version__pyproject.toml のみ非対応非常にシンプルな単一モジュールのパッケージ
poetrypyproject.toml のフィールドpyproject.toml のみ非対応依存関係管理の統合を求めるチーム

4種類すべての完全な pyproject.toml テンプレートについては、references/pyproject-toml.md を参照してください。


5. PyPA のパッケージングフロー

これは、ソースコードからユーザーによるインストールまでの標準的なエンドツーエンドのフローです。 公開する前に、すべての手順を理解しておく必要があります。

1. SOURCE TREE
   Your code in version control (git)
   └── pyproject.toml describes metadata + build system

2. BUILD
   python -m build
   └── Produces two artifacts in dist/:
       ├── *.tar.gz   → source distribution (sdist)
       └── *.whl      → built distribution (wheel) — preferred by pip

3. VALIDATE
   twine check dist/*
   └── Checks metadata, README rendering, and PyPI compatibility

4. TEST PUBLISH (first release only)
   twine upload --repository testpypi dist/*
   └── Verify: pip install --index-url https://test.pypi.org/simple/ your-package

5. PUBLISH
   twine upload dist/*          ← manual fallback
   OR GitHub Actions publish.yml  ← recommended (Trusted Publishing / OIDC)

6. USER INSTALL
   pip install your-package
   pip install "your-package[extra]"
PyPA の主な概念
概念意味
sdistソース配布物 — ソースとメタデータを含みます。wheel が利用できない場合に使用されます
wheel (.whl)ビルド済みのバイナリ — pip が site-packages に直接展開するため、ビルド手順は不要です
PEP 517/518pyproject.toml の [build-system] テーブルを介した標準ビルドシステムインターフェース
PEP 621pyproject.toml の標準 [project] テーブル。現在のすべてのバックエンドが対応しています
PEP 639SPDX 文字列としての license キー(例:"MIT"、"Apache-2.0")。{text = "MIT"} ではありません
PEP 561空のマーカーファイル py.typed。パッケージに型情報が含まれていることを mypy/IDE に伝えます

CI ワークフローと公開設定の詳細については、references/ci-publishing.md を参照してください。


6. プロジェクト構成のテンプレート

A. src/ レイアウト(新規プロジェクトに推奨されるデフォルト)
your-package/
├── src/
│   └── your_package/
│       ├── __init__.py           # Public API: __all__, __version__
│       ├── py.typed              # PEP 561 marker — EMPTY FILE
│       ├── core.py               # Primary implementation
│       ├── client.py             # (API client type) or remove
│       ├── cli.py                # (CLI type) click/typer commands, or remove
│       ├── config.py             # Settings / configuration dataclass
│       ├── exceptions.py         # Custom exception hierarchy
│       ├── models.py             # Data classes, Pydantic models, TypedDicts
│       ├── utils.py              # Internal helpers (prefix _utils if private)
│       ├── types.py              # Shared type aliases and TypeVars
│       └── backends/             # (Plugin pattern) — remove if not needed
│           ├── __init__.py       # Protocol / ABC interface definition
│           ├── memory.py         # Default zero-dep implementation
│           └── redis.py          # Optional heavy implementation
├── tests/
│   ├── __init__.py
│   ├── conftest.py               # Shared fixtures
│   ├── unit/
│   │   ├── __init__.py
│   │   ├── test_core.py
│   │   ├── test_config.py
│   │   └── test_models.py
│   ├── integration/
│   │   ├── __init__.py
│   │   └── test_backends.py
│   └── e2e/                      # Optional: end-to-end tests
│       └── __init__.py
├── docs/                         # Optional: mkdocs or sphinx
├── scripts/
│   └── scaffold.py
├── .github/
│   ├── workflows/
│   │   ├── ci.yml
│   │   └── publish.yml
│   └── ISSUE_TEMPLATE/
│       ├── bug_report.md
│       └── feature_request.md
├── .pre-commit-config.yaml
├── pyproject.toml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── SECURITY.md
├── LICENSE
├── README.md
└── .gitignore
B. フラットレイアウト(小規模/特化型パッケージ)
your-package/
├── your_package/         # ← at root, not inside src/
│   ├── __init__.py
│   ├── py.typed
│   └── ... (same internal structure)
├── tests/
└── ... (same top-level files)
C. 名前空間/モノレポの構成(複数の関連パッケージ)
your-org/
├── packages/
│   ├── your-org-core/
│   │   ├── src/your_org/core/
│   │   └── pyproject.toml
│   ├── your-org-http/
│   │   ├── src/your_org/http/
│   │   └── pyproject.toml
│   └── your-org-cli/
│       ├── src/your_org/cli/
│       └── pyproject.toml
├── .github/workflows/
└── README.md

各サブパッケージには、それぞれ独自の pyproject.toml があります。PEP 420 の暗黙的な名前空間パッケージを使って your_org 名前空間を共有します(名前空間のルートには __init__.py を置きません)。

内部モジュールのガイドライン
ファイル目的含めるタイミング
__init__.py公開 API の窓口、再エクスポート、__version__常に
py.typedPEP 561 の型付きパッケージマーカー(空ファイル)常に
core.py主要なクラス/メインロジック常に
config.py設定用のデータクラスまたは Pydantic モデル設定可能な場合
exceptions.py例外の階層(YourBaseError → 個別の例外)常に
models.pyデータモデル/DTO/TypedDictデータが多い場合
utils.py内部ヘルパー(公開 API の一部ではありません)必要に応じて
types.py共通の TypeVar、TypeAlias、Protocol の定義複雑な型付けが必要な場合
cli.pyCLI エントリーポイント(click/typer)CLI 型のみ
backends/プラグイン/ストラテジーパターン実装を切り替え可能にする場合
_compat.pyPython バージョン互換性用のシム3.9~3.13 との互換性が必要な場合

7. バージョニング戦略

PEP 440 — 標準
Canonical form:  N[.N]+[{a|b|rc}N][.postN][.devN]

Examples:
  1.0.0          Stable release
  1.0.0a1        Alpha (pre-release)
  1.0.0b2        Beta
  1.0.0rc1       Release candidate
  1.0.0.post1    Post-release (e.g., packaging fix only)
  1.0.0.dev1     Development snapshot (not for PyPI)
セマンティックバージョニング(推奨)
MAJOR.MINOR.PATCH

MAJOR: Breaking API change (remove/rename public function/class/arg)
MINOR: New feature, fully backward-compatible
PATCH: Bug fix, no API change
setuptools_scm による動的なバージョニング(Git タグを使うワークフローに推奨)
# How it works:
git tag v1.0.0          →  installed version = 1.0.0
git tag v1.1.0          →  installed version = 1.1.0
(commits after tag)     →  version = 1.1.0.post1  (suffix stripped for PyPI)

# In code — NEVER hardcode when using setuptools_scm:
from importlib.metadata import version, PackageNotFoundError
try:
    __version__ = version("your-package")
except PackageNotFoundError:
    __version__ = "0.0.0-dev"    # Fallback for uninstalled dev checkouts

必須の pyproject.toml 設定:

[tool.setuptools_scm]
version_scheme = "post-release"
local_scheme   = "no-local-version"   # Prevents +g<hash> from breaking PyPI uploads

重要: すべての CI のチェックアウト手順で、必ず fetch-depth: 0 を設定してください。Git の完全な履歴がないと、setuptools_scm はタグを見つけられず、ビルドバージョンは警告なしに 0.0.0+dev にフォールバックします。

静的なバージョニング(flit、hatchling の手動設定、poetry)
# your_package/__init__.py
__version__ = "1.0.0"    # Update this before every release
依存関係のバージョン指定に関するベストプラクティス
# In [project] dependencies:
"httpx>=0.24"            # Minimum version — PREFERRED for libraries
"httpx>=0.24,<1.0"       # Upper bound only when a known breaking change exists
"httpx==0.27.0"          # Pin exactly ONLY in applications, NOT libraries

# NEVER do this in a library — it breaks dependency resolution for users:
# "httpx~=0.24.0"        # Too tight
# "httpx==0.27.*"        # Fragile
バージョン更新からリリースまでの流れ
# 1. Update CHANGELOG.md — move [Unreleased] entries to [x.y.z] - YYYY-MM-DD
# 2. Commit the changelog
git add CHANGELOG.md
git commit -m "chore: prepare release vX.Y.Z"
# 3. Tag and push — this triggers publish.yml automatically
git tag vX.Y.Z
git push origin main --tags
# 4. Monitor GitHub Actions → verify on https://pypi.org/project/your-package/

4 つのバックエンドすべてに対応した pyproject.toml の完全なテンプレートについては、references/pyproject-toml.md を参照してください。


次に進むには

設計上の判断と構成を理解したら、次の手順に進みます。

  1. pyproject.toml を設定する → references/pyproject-toml.md
    4 つのバックエンドのテンプレート(setuptools+scm、hatchling、flit、poetry)、ツールの完全な設定、
    py.typed の設定、バージョニングの設定。

  2. ライブラリのコードを書く → references/library-patterns.md
    OOP/SOLID の原則、型ヒント(PEP 484/526/544/561)、コアクラスの設計、ファクトリー関数、
    __init__.py、プラグイン/バックエンドパターン、CLI エントリーポイント。

  3. テストとコード品質の設定を追加する → references/testing-quality.md
    conftest.py、単体/バックエンド/非同期テスト、パラメーター化、ruff/mypy/pre-commit の設定。

  4. CI/CD を設定して公開する → references/ci-publishing.md
    Trusted Publishing(OIDC、API トークン不要)を使用する ci.yml と publish.yml、CHANGELOG の形式、
    リリースチェックリスト。

  5. コミュニティ/OSS 向けに仕上げる → references/community-docs.md
    README のセクション、docstring の形式、CONTRIBUTING、SECURITY、Issue テンプレート、アンチパターン
    の表、リリースの総合チェックリスト。

  6. バックエンド、設定、トランスポート、CLI を設計する → references/architecture-patterns.md
    バックエンドシステム(プラグイン/ストラテジーパターン)、設定用データクラス、HTTP トランスポート層、
    click/typer による CLI、バックエンドの注入ルール。

  7. バージョニング戦略を選んで実装する → references/versioning-strategy.md
    PEP 440 の標準形式、SemVer のルール、プレリリース識別子、setuptools_scm の詳細解説、
    flit の静的バージョニング、意思決定ガイド(DEFAULT/BEGINNER/MINIMAL)。

  8. リリースを管理し、公開パイプラインを保護する → references/release-governance.md
    ブランチ戦略、ブランチ保護ルール、OIDC Trusted Publishing の設定、CI でのタグ作成者の検証、
    タグ形式の強制、管理機能をすべて備えた publish.yml。

  9. Ruff でツール構成をシンプルにする → references/tooling-ruff.md
    black/isort/flake8 を置き換える Ruff のみの設定、mypy の設定、pre-commit フック、
    asyncio_mode=auto(@pytest.mark.asyncio を削除)、移行ガイド。

コメント