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 build 가 dist/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 — 매번 깨끗히 빌드.
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.
이전 lesson 의 mini_pkg. python -m build 실행 + 생성된 wheel 들여다보기. zip 으로 열어 (unzip -l dist/*.whl) 확인 — 패키지 이름 가진 METADATA 파일, WHEEL 파일, __init__.py 와 cli.py 소스. 실제 PyPI 업로드 X — 빌드 작동만 확인.
Progress
Progress is local-only — sign in to sync across devices.