Featured image of post [Python Cheatsheet] 62. Packaging - pyproject.toml/배포 체크리스트

[Python Cheatsheet] 62. Packaging - pyproject.toml/배포 체크리스트

파이썬 패키지 배포를 빠르게 시작하기 위한 치트시트입니다. pyproject.toml 구조, build/twine으로 PyPI 배포, 의존성 명세, 엔트리포인트, 배포 전 체크리스트를 최소 예제로 정리합니다.

파이썬 패키지 배포는 pyproject.toml 기반이 표준입니다. 이 치트시트는 pyproject.toml 구조, build + twine으로 PyPI 배포, 의존성 명세, 배포 전 체크리스트를 정리합니다.

언제 이 치트시트를 보나?

  • 내가 만든 라이브러리를 pip install로 설치 가능하게 만들고 싶을 때
  • PyPI에 패키지를 배포하고 싶을 때

핵심 패턴

  • 설정 파일: pyproject.toml (PEP 517/518/621 표준)
  • 빌드: python -m builddist/ 폴더에 wheel + sdist 생성
  • 업로드: twine upload dist/*
  • 개발 모드 설치: pip install -e .

pyproject.toml 기본 구조

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "my-package"
version = "0.1.0"
description = "A short description"
readme = "README.md"
license = {text = "MIT"}
authors = [
    {name = "Your Name", email = "you@example.com"}
]
requires-python = ">=3.8"

# 의존성
dependencies = [
    "requests>=2.28",
    "click>=8.0",
]

# 선택적 의존성 (pip install my-package[dev])
[project.optional-dependencies]
dev = [
    "pytest>=7.0",
    "black",
    "mypy",
]

# CLI 엔트리포인트
[project.scripts]
my-cli = "my_package.cli:main"

[project.urls]
Homepage = "https://github.com/you/my-package"
Documentation = "https://my-package.readthedocs.io"

빌드 및 배포

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 필요 도구 설치
pip install build twine

# 빌드 (dist/ 폴더 생성)
python -m build

# TestPyPI에 먼저 테스트 업로드
twine upload --repository testpypi dist/*

# TestPyPI에서 설치 테스트
pip install --index-url https://test.pypi.org/simple/ my-package

# 실제 PyPI 업로드
twine upload dist/*

개발 모드 설치

1
2
3
4
5
# 소스 코드 변경이 바로 반영됨
pip install -e .

# 선택적 의존성 포함
pip install -e ".[dev]"

프로젝트 구조 예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
my-package/
├── pyproject.toml
├── README.md
├── LICENSE
├── src/
│   └── my_package/
│       ├── __init__.py
│       ├── core.py
│       └── cli.py
└── tests/
    └── test_core.py
1
2
3
# src 레이아웃 사용 시 추가 설정
[tool.setuptools.packages.find]
where = ["src"]

배포 전 체크리스트

  • pyproject.tomlversion 업데이트
  • README.md 최신 상태 확인
  • LICENSE 파일 존재
  • python -m build 성공
  • 로컬에서 pip install dist/*.whl 테스트
  • TestPyPI에 먼저 업로드 후 설치 테스트
  • Git tag 생성 (git tag v0.1.0)
  • PyPI 업로드

자주 하는 실수/주의점

  • 패키지 이름 충돌: PyPI에 이미 있는 이름은 사용 불가 → 먼저 검색
  • 버전 형식: PEP 440 준수 (예: 1.0.0, 1.0.0a1)
  • __init__.py 없으면 패키지로 인식 안 됨
  • MANIFEST.in 또는 pyproject.tomlinclude로 데이터 파일 포함 필요
  • PyPI 업로드 후에는 같은 버전 덮어쓰기 불가 → 새 버전으로 올려야 함

관련 링크(공식 문서)