본문 바로가기
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

[build-system]은 pip가 어떤 backend와 요구사항으로 패키지를 만들지, [project]는 이름·버전·Python 범위·의존성·라이선스를 선언해. ruff·mypy·pytest 같은 도구도 [tool.*] 아래 설정을 모을 수 있어.

라이브러리는 다른 패키지와 함께 설치될 범위를 열어 두고, 애플리케이션은 별도 lock으로 실제 배포 조합을 고정해. 선언 범위와 해결된 lock은 책임이 달라.

pip install -e .는 소스 위치를 직접 import하게 해 개발 중 변경을 바로 반영해. 배포 설치와는 구분해.

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"
한 파일에 모으는 도구 설정·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

hatchling backend, mini-pkg 0.1, click 의존성을 가진 /tmp/mini_pkg를 만들고 editable로 설치해 from mini_pkg import __version__가 동작하는지 확인해.

Progress

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

댓글 0

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

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