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

pyproject.toml — 현대 프로젝트 파일

~18 min · pyproject, build-system, metadata, pip

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

단일 진실 소스

pyproject.toml (PEP 517 / 518 / 621) 이 현대 Python 프로젝트 파일. setup.py, setup.cfg, 도구별 config 파일 12 개 대체. 안에 — 빌드 시스템, 패키지 메타데이터 (이름, 버전, 의존성), 도구 설정 (ruff, mypy, pytest 등).

두 핵심 섹션

[build-system] 이 pip 한테 패키지 빌드 방법 알려줌 — 빌드 backend (예 hatchling, setuptools, poetry-core). [project] 가 메타데이터 — 이름, 버전, 설명, 의존성, Python 버전 요구사항, 라이선스. 도구 섹션 ([tool.ruff], [tool.mypy] 등) 옵션.

의존성 — pin 됐 vs 안 됐

[project.dependencies] 에 런타임 의존성. 라이브러리엔 loosely pin (requests >= 2.31) — 너무 pin 하면 모두와 호환 X. 애플리케이션엔 tightly pin (requests == 2.31.0) — 재현 가능 deploy 원함. dev-only deps (pytest, ruff) 엔 [project.optional-dependencies.dev].

Editable install — dev 패턴

pip install -e . (또는 uv pip install -e .) 가 패키지를 "editable" 모드로 설치 — Python 이 소스 디렉토리에서 import, 편집이 즉시 반영, 재설치 X. 패키지 개발 시 필수.

Pythonic Way: 모든 Python 프로젝트가 pyproject.toml 가짐, 작아도. 도구 설정 (ruff/mypy/pytest) 의 정석 위치, 모든 현대 도구가 거기서 읽음. 새 프로젝트엔 setup.py deprecated.

Code

최소 pyproject.toml·toml
# pyproject.toml
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "my-package"
version = "0.1.0"
description = "작은 패키지"
readme = "README.md"
requires-python = ">=3.10"
authors = [{name = "Pippa", email = "pippa@example.com"}]
dependencies = [
    "requests>=2.31",
    "click>=8.0",
]

[project.optional-dependencies]
dev = [
    "pytest>=7.0",
    "ruff>=0.1",
    "mypy>=1.0",
]

[project.scripts]
my-cli = "my_package.cli:main"
도구 섹션 — 한 곳에 config·toml
# pyproject.toml (계속)
[tool.ruff]
line-length = 100
select = ["E", "F", "W", "I", "UP"]

[tool.mypy]
python_version = "3.10"
strict = true
ignore_missing_imports = true

[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
addopts = "-v --tb=short"
프로젝트 설치·bash
# Editable install (개발)
pip install -e .

# Editable + dev 의존성
pip install -e ".[dev]"

# 배포용 wheel 빌드
pip install build
python -m build           # dist/my-package-0.1.0-*.whl 생성

# PyPI 업로드 (publish 준비됐으면)
# pip install twine
# twine upload dist/*
런타임에 프로젝트 메타데이터 읽기·python
# 3.8+ — importlib.metadata
from importlib.metadata import version, metadata

print(version("requests"))             # '2.31.0'
m = metadata("requests")
print(m["Name"])
print(m["Version"])
print(m["Summary"])

# 유용 — 자체 패키지 버전 표시, 설치된 deps 체크

External links

Exercise

작은 패키지 디렉토리 /tmp/mini_pkg/pyproject.toml (build backend hatchling, name 'mini-pkg', version '0.1', 의존성 단일 'click'), mini_pkg/__init__.py (__version__ = '0.1' 정의), mini_pkg/cli.py ('hi' 출력하는 click 커맨드). venv 에서 pip install -e /tmp/mini_pkg/ 실행 + from mini_pkg import __version__ 작동 확인.

Progress

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

댓글 0

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

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