setup.cfg vs. pyproject.toml

setup.cfg와 pyproject.toml은 Python 프로젝트의 구성과 메타데이터를 정의하는 파일 형식이다.
이 두 파일은 프로젝트 설정, 의존성, 빌드 시스템 등을 관리하는 데 사용되며, 각각의 특징과 용도가 있다.

setup.cfg는 setuptools를 사용하는 전통적인 Python 패키징 시스템의 일부이다.

  • 형식: INI 스타일의 설정 파일
  • 주요 용도:
    • 프로젝트 메타데이터 정의 (이름, 버전, 설명 등)
    • 의존성 선언
    • 패키지 데이터 및 스크립트 설정
  • 특징:
    • setup.py와 함께 사용되어 왔음
    • 정적 메타데이터를 선언적으로 정의하는 데 적합
    • 레거시 도구와의 호환성 유지

pyproject.toml은 PEP 518에서 도입된 새로운 표준 구성 파일이다.

  • 형식: TOML (Tom’s Obvious, Minimal Language)
  • 주요 용도:
    • 빌드 시스템 요구사항 정의
    • 프로젝트 메타데이터 정의
    • 다양한 개발 도구 설정 (예: Black, Pytest, Mypy 등)
  • 특징:
    • 모던한 Python 패키징 시스템의 중심
    • 빌드 격리 지원
    • 다양한 빌드 백엔드 지원 (setuptools, poetry, flit 등)
    • 단일 파일에서 프로젝트 전체 설정 관리 가능

주요 차이점:

  1. 표준화: pyproject.toml은 PEP 518, 621 등에 의해 표준화되어 있어 도구 간 호환성이 높다.
  2. 유연성: pyproject.toml은 빌드 시스템과 도구 설정을 더 유연하게 관리할 수 있다.
  3. 확장성: pyproject.toml은 다양한 도구의 설정을 통합할 수 있어 설정 파일 수를 줄일 수 있다.
  4. 현대화: pyproject.toml은 최신 Python 패키징 생태계의 트렌드를 반영하고 있다.
  5. 호환성: setup.cfg는 레거시 시스템과의 호환성이 더 좋다.

현재 Python 커뮤니티는 점진적으로 pyproject.toml로 이동하는 추세이지만, 많은 프로젝트들이 여전히 setup.cfg를 사용하고 있다.
새로운 프로젝트를 시작할 때는 pyproject.toml을 사용하는 것이 권장되며, 기존 프로젝트는 필요에 따라 점진적으로 마이그레이션할 수 있다.

특성setup.cfgpyproject.toml
파일 형식INI 형식TOML 형식
도입 시기Python의 전통적인 설정 파일PEP 518에서 도입 (2016년)
주요 목적- 패키지 빌드 설정
- 개발 도구 설정
- 프로젝트 메타데이터 관리
- 빌드 시스템 요구사항 정의
- 프로젝트 전반의 설정 통합
- 현대적 빌드 도구 지원
문법 특징- 단순한 키-값 구조
- 섹션 기반 구성
- 제한된 데이터 타입
- 들여쓰기로 계층 표현
- 더 풍부한 데이터 타입
- 명확한 계층 구조
- 배열과 테이블 지원
UTF-8 지원
도구 지원- setuptools
flake8
pytest
coverage
mypy (기존 도구)
- poetry
black
isort
pytest
mypy (새로운 도구)
구성 가능성- 기본적인 설정 옵션
- 제한된 확장성
- 단순한 값만 지원
- 복잡한 설정 가능
- 높은 확장성
- 다양한 데이터 구조 지원
호환성- 레거시 도구와 호환
- 광범위한 지원
- 안정적인 생태계
- 최신 도구와 호환
- 점진적으로 증가하는 지원
- 현대적인 생태계
사용 추천- 레거시 프로젝트
- 간단한 설정 필요
- 기존 도구 사용
- 새로운 프로젝트
- 현대적 도구 사용
- 복잡한 설정 필요
장점- 단순한 구문
- 널리 사용됨
- 안정적
- 학습 곡선 낮음
- 강력한 기능
- 타입 안전
- 현대적 표준
- 통합된 설정
단점- 제한된 기능
- 복잡한 설정 어려움
- 오래된 형식
- 학습 곡선 높음
- 일부 도구 미지원
- 상대적으로 새로움
파이썬 버전모든 버전 지원Python 3.5+ 권장
주요 사용례- 기본 패키지 메타데이터
- 간단한 도구 설정
- 배포 설정
- 의존성 관리
- 빌드 시스템 설정
- 개발 도구 통합 설정
미래 전망- 점진적으로 감소
- 레거시 지원 유지
- 안정적 유지
- 사용 증가
- 기능 확장
- 표준화 진행

설정 파일 비교

setup.cfg 예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# setup.cfg 예시
[metadata]
name = my-project
version = 1.0.0
author = Hong Gil Dong

[options]
packages = find:
install_requires =
    requests>=2.25.0
    pandas>=1.2.0

[tool:pytest]
testpaths = tests
python_files = test_*.py

pyproject.toml 예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# pyproject.toml 예시
[project]
name = "my-project"
version = "1.0.0"
authors = [
    {name = "Hong Gil Dong", email = "gildong@example.com"}
]

[project.dependencies]
requests = ">=2.25.0"
pandas = ">=1.2.0"

[tool.pytest]
testpaths = ["tests"]
python_files = ["test_*.py"]

[build-system]
requires = ["setuptools>=45", "wheel"]
build-backend = "setuptools.build_meta"

참고 및 출처