C.W.K.
Stream
Lesson 05 of 05 · published

코드 배포 — PyPI + Wheel

~15 min · pypi, wheel, publishing, twine

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

PyPI 생태계

pip install foo 가 디폴트로 PyPI 에서 다운. 누구나 publish 가능 — public 레지스트리. 흐름 — 패키지를 wheel 로 빌드, twine upload 실행, 몇 분 안에 누구나 pip install your-package. 장벽은 기술적 X, 사람들이 원하는 유용한 코드 짜는 거.

Wheel — 바이너리 배포 포맷

wheel (.whl) 이 pip 가 setup 코드 안 돌리고 직접 설치 가능한 특정 레이아웃의 zip. 옛 sdist 포맷보다 빠르고 안전. Pure-Python 패키지가 한 universal wheel 생산, C extension 가진 패키지가 플랫폼별 wheel (OS / Python 버전 / 아키텍처별).

publishing 흐름

(1) pyproject.toml 맞는지 확인 — 이름, 버전, 의존성. (2) python -m builddist/your-package-version-*.whl + sdist 생성. (3) twine upload dist/* 가 PyPI 에 push (계정 등록 + 토큰 받은 후). 첫 업로드가 이름 잠금, 이후 버전은 bump + re-upload.

Test PyPI — staging 영역

진짜 publish 전에 test.pypi.org 에 push. 같은 모양의 별 인스턴스, 진짜 청중 X. 처음엔 거기 push, fresh venv 에서 install, 작동 확인, 그 다음 진짜 PyPI 에.

War Story: PyPI 에 한번 올라가면 unpublish 못 함 — yank (나쁘다 표시) 만 가능. 버전 맞게 하는 게 중요. 흔한 패턴 — 버전 bump, 빌드, fresh venv 테스트, 그 다음 업로드. 개발한 디렉토리에서 절대 업로드 X — 매번 깨끗히 빌드.

Code

Wheel 빌드·bash
# 빌드 도구 설치
pip install build

# pyproject.toml 있는 프로젝트에서
python -m build

# 결과:
# dist/
#   my_package-0.1.0-py3-none-any.whl    # wheel
#   my-package-0.1.0.tar.gz               # sdist

# wheel 들여다보기 (zip 임)
unzip -l dist/my_package-0.1.0-py3-none-any.whl
Test PyPI 먼저 publish·bash
pip install twine

# test.pypi.org 업로드
twine upload --repository testpypi dist/*

# test.pypi.org 에서 install (deps 는 진짜 PyPI 에서)
pip install --index-url https://test.pypi.org/simple/ \
            --extra-index-url https://pypi.org/simple/ \
            my-package

# 진짜 PyPI 가기 전 fresh venv 에서 작동 확인
진짜 PyPI publish·bash
# test.pypi.org 테스트 후
twine upload dist/*

# 필요:
# 1. https://pypi.org/ PyPI 계정
# 2. API 토큰 (계정 설정에서)
# 3. ~/.pypirc 에 토큰 설정, 또는 TWINE_PASSWORD 환경변수

# 업로드 후 누구나:
# pip install my-package
Versioning 컨벤션 — semantic versioning·python
# 버전 포맷: MAJOR.MINOR.PATCH (semver)
# 1.0.0 — 첫 stable 릴리스
# 1.0.1 — 버그 fix (새 기능 X)
# 1.1.0 — 새 기능 (backwards-compatible)
# 2.0.0 — breaking 변경 (호출자가 업데이트 필요할 수)
#
# Pre-release: 1.0.0a1 (alpha), 1.0.0b1 (beta), 1.0.0rc1 (RC)
# Dev: 1.0.0.dev0
#
# 단일 진실 소스 — pyproject.toml [project] version 필드.
# 프로그램으로 필요 없으면 __version__ 에 중복 X.
# 설치된 패키지에서 읽으려면 importlib.metadata.

External links

Exercise

이전 lesson 의 mini_pkg. python -m build 실행 + 생성된 wheel 들여다보기. zip 으로 열어 (unzip -l dist/*.whl) 확인 — 패키지 이름 가진 METADATA 파일, WHEEL 파일, __init__.pycli.py 소스. 실제 PyPI 업로드 X — 빌드 작동만 확인.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.