pyproject.toml
는 빌드 백엔드 선택에 유연성을 제공합니다. PEP 518 이후 빌드 백엔드를 명시하면 pip나 다른 설치도구가 해당 백엔드를 활용해 프로젝트를 빌드할 수 있습니다. 하지만 빌드 백엔드(예: Flit, Poetry, Hatch, Setuptools)가 각각 고유한 철학과 기능을 갖고 있어, 프로젝트 요구사항에 따라 적절한 백엔드를 선택하는 전략이 필요합니다.

이번 글에서는 대표적인 빌드 백엔드를 비교하고, 상황별로 어떤 빌드 백엔드가 적합한지 판단할 수 있는 가이드를 제안합니다.
대표적인 빌드 백엔드 소개
- Setuptools (setuptools.build_meta)
- 가장 오래되고 전통적인 빌드 시스템
- 호환성 광범위, 큰 생태계 지원
- 단점: 설정 방식이 비교적 복잡, 과거 유산(
setup.py
)와 혼재
- Flit (flit_core.buildapi)
- 단순한 패키징에 특화
- 최소한의 설정으로 wheel 빌드 가능
- 단점: 고급 기능(의존성 범위 지정, 가상환경 관리 등) 제한적
- Poetry (poetry.core.masonry.api)
- 의존성 관리, 가상환경 관리까지 통합한 올인원 솔루션
- 배포, 빌드, 의존성 해석까지 명령어 하나로 해결 가능
- 단점: 설정 문법과 툴 학습 필요, 약간의 초기 러닝 커브
- Hatch (hatchling)
- 최신 패키징 트렌드 반영, 릴리즈 전략, 버전 관리, 다중 환경 지원
- pyproject.toml만으로 다양한 빌드·테스트·배포 시나리오 구성 용이
- 단점: 도입 시 Hatch 생태계 학습 필요
빌드 백엔드 선택 기준
- 프로젝트 규모/복잡도:
- 단순 패키지: Flit 간단
- 대규모 프로젝트, 의존성 해석, 배포 자동화 필요: Poetry나 Hatch 유리
- 기존 에코시스템 호환성:
- 오래된 코드베이스나 기존 setuptools 기반 워크플로우: Setuptools 유지
- 신규 프로젝트, 모던 접근: Poetry나 Hatch 고려
- 의존성 관리 편의성:
- Poetry: pyproject.toml 하나로 의존성 해석, 가상환경 관리 자동화
- Hatch: 다양한 릴리즈 전략, 환경별 설정 제공
- 빌드 속도, 성능 최적화:
- Flit: 단순 빌드에 최적, 속도 빠름
- Hatchling: 최신 표준 적극 반영, 효율적 빌드 프로세스 제공
예제 시나리오
- 연구용 단순 패키지: Flit 사용
- pyproject.toml:
[build-system]
에flit_core
,[project]
에 기본 메타데이터 flit build
명령으로 wheel 생성
- pyproject.toml:
- 기업용 대규모 서비스 라이브러리: Poetry 사용
- 의존성 락(lock) 파일로 재현성 확보
poetry add
,poetry update
로 편리한 의존성 관리poetry build
,poetry publish
로 CI/CD 파이프라인 간소화
- 여러 실험 환경(테스트, dev, prod) 필요: Hatch
pyproject.toml
에서 hatch 환경 정의hatch run
등 명령으로 환경별 명령어 실행- 복잡한 릴리즈 관리 자동화
빌드 백엔드 전환 시 전략
- 기존 setuptools 기반 프로젝트를 Poetry로 전환 시
pyproject.toml
를 작성하고poetry init
으로 의존성 변환 - 점진적 도입: 초기에는 just 빌드 백엔드만 pyproject.toml로 설정, 이후 의존성 관리와 도구 설정 점진적 이전
- 팀 내 표준화: 빌드 백엔드 선택, pyproject.toml 구조 합의 후 템플릿화로 새 프로젝트 생성 시 일관성 유지
결론
- pyproject.toml 덕분에 빌드 백엔드 선택이 쉬워지고, 도구 상호 호환성 확보
- Flit, Poetry, Hatch, Setuptools 각각 장단점이 있으니 프로젝트 목표, 팀 요구사항, 생태계 선호도 등에 따라 결정
- 모던 Python 패키징에서는 Poetry나 Hatch 등 발전된 빌드 백엔드를 활용하는 추세
다음 글에서는 실제 예제 프로젝트를 통해 pyproject.toml 구성 전 과정을 시연하고, 빌드 백엔드 선택, 의존성 선언, 스크립트 정의, 툴 설정을 종합해보는 실습을 진행하겠습니다.
반응형
'개발 이야기 > Python (파이썬)' 카테고리의 다른 글
[pyproject.toml 완전 정복 8편] 마이그레이션 전략 및 베스트 프랙티스 (0) | 2024.12.17 |
---|---|
[pyproject.toml 완전 정복 7편] 실제 프로젝트 예제 종합 실습 (0) | 2024.12.17 |
[pyproject.toml 완전 정복 5편] [tool.*] 섹션으로 빌드 백엔드 및 린터·포매터 설정 통합 (0) | 2024.12.17 |
[pyproject.toml 완전 정복 4편] 의존성 관리와 스크립트 정의 (0) | 2024.12.17 |
[pyproject.toml 완전 정복 3편] [project] 섹션: PEP 621 표준 메타데이터 정의 (0) | 2024.12.17 |