최근 파이썬 프로젝트들을 보면 pyproject.toml, poetry 와 같은 키워드들이 점점 많이 보이기 시작한다. pyproject.toml 은 뭐고 poetry 는 또 무엇일까?

| 연도 | 소스코드 테스트 | 패키지 빌드 (패키징, 가장 기본적인 기능) | 패키지 빌드 기능: 엔트리포인트 관리, 메타데이터 관리 | 패키지 업로드 | 패키지 저장소 | 패키지 다운로드 종류: 소스코드, sdist, 사전 빌드된 바이너리 파일(ref15) | 패키지 설치를 위한 패키지 빌드 (가장 기본적인 기능) | 패키지 빌드 기능: 의존성 처리 | 패키지 설치 기능: 빌드된 파일을 시스템 위치로 이동 | 패키지 설치 기능: 엔트리포인트 관리, 메타데이터 관리 | 설치된 패키지 관리 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | 1998 | | distutils + setup.py | | | 파이썬 커뮤니티 | VCS | distutils + setup.py

생성: 빌드 결과물 | | distutils + setup.py

이동: 빌드 결과물 | | | | 2003 | | distutils + setup.py | | | PyPI | VCS | distutils + setup.py

생성: 빌드 결과물 | | distutils + setup.py

이동: 빌드 결과물 | | | | 2004 | setuptools + setup.py (ref5) | setuptools + setup.py | setuptools + setup.py (ref6) | setuptools + setup.py | PyPI | VCS, setuptools (easy_install) (ref7) | setuptools (easy_install) → (ref10:빌드 프론트) setuptools + setup.py

이동: 빌드 결과물 | setuptools + setup.py | setuptools (easy_install) → (ref10:빌드 프론트) setuptools + setup.py

이동: 빌드 결과물 | setuptools + setup.py | | | 2008 | unittest, pytest | setuptools + setup.py | setuptools + setup.py | twine | PyPI | VCS, pip | pip (install) → setuptools + setup.py

생성: wheel | setuptools + setup.py | pip (install) → setuptools + setup.py +

이동: wheel | setuptools + setup.py | pip | | 현재: 2024/03/19 | ??? | ??? | ??? | twine | PyPI | VCS, pip | ??? | ??? | ??? | ??? | pip | | TO-BE | 빌드 프론트엔드 → pyproject.toml→ 테스트 백엔드(unittest, pytest) | 빌드 프론트엔드 → pyproject.toml→ 빌드 백엔드 | 빌드 프론트엔드 → pyproject.toml→ 빌드 백엔드 | twine | PyPI | VCS, pip | 빌드 프론트엔드 → pyproject.toml→ 빌드 백엔드

생성: wheel | 빌드 백엔드에 전달된 pyproject.toml→ 빌드 백엔드 | 빌드 프론트엔드 → pyproject.toml→ 빌드 백엔드

이동: wheel | 빌드 백엔드에 전달된 pyproject.toml→ 빌드 백엔드 | pip 또는 poetry → pyproject.toml |

약어 의미
PyPI Python Package Index
pip Pip Install Package: 재귀적 의미 😅
VCS Version Control System (e.g. git과 github)

역사적으로 볼 때 setuptools 는 setup.py 와 강하게 결합될 수밖에 없었던 운명이다. 1998년 distutils 와 setup.py 가 탄생하던 시절 둘은 한몸이었다(ref4). 2003년 setuptools는 distutils를 구조적으로 고친 것이 아니라 기능을 확장하며 setup.py 를 그대로 사용했다.

setup.py 파일과 setuptools 가 강하게 결합되었다는 것은 setup.py 을 파싱하기 위해 setuptools 를 사용했다는 것을 의미한다. 이것이 문제가 되는 이유는, 설치를 위해 setup.py 를 파싱하기 위해서는 적절한 setuptools 버전이 필요한데, 적절한 setuptools 버전은 setup.py 에 명세되었기 때문이다. setup.py 를 읽어가는 방식이 다시 도구에 의존하게 되면서 버전 명세 등이 불가능했다(ref2).

변화의 핵심 아이디어는 setup.py 파일을 특정 언어나 도구에 종속시키지 말고 pyproject.toml 이라는 표준을 만들어 다양한 백엔드가 단일 파일을 일관된 형태로 읽어가도록 강제하는 것이다. 지금은 pyproject.toml 표준이 만들어진 지 얼마 안 된 과도기이다. 그래서 다양한 빌드 백엔드마다 동일한 기능을 pyproject.toml 에 다르게 명세해야 한다는 문제가 있음을 인지하는 것이 좋다(ref3).

빌드 프론트엔드(ref11) 참조하는 파일 비고
pip install 패키징용이 아니라 설치용임
build(ref14) pyproject.toml 예제 프론트엔드, C익스텐션 없어 가벼움(ref17)
flit pyproject.toml 순수 파이썬 구현, C익스텐션 없어 가벼움(ref16)
hatch pyproject.toml PEP준수, 다양한 기능, 빠르게 성장 중(ref9)
poetry pyproject.toml 무거움, PEP 준수 안 함(ref3,ref8)
setuptools(ref10) pyproject.toml, setup.py 유지관리 중단(ref1)
distutils setup.py deprecated (python 3.10~)
빌드 백엔드(ref12,ref13) 비고
setuptools(ref10) 유지관리 중단(ref1)
flit-core(ref13) flit의 메인 백엔드
hatchling(ref13) hatch의 메인 백엔드
poetry-core(ref13) poetry의 유일한(ref8) 백엔드

<aside> ✍️ poetry 는 의존성 해결 역량이 뛰어나고, 자체 가상환경을 지원하는 등 기능이 풍부하지만 pyproject.toml PEP 표준을 지키지 않고 있기 때문에 복잡한 프로젝트가 아니라면 일단 flit 으로 시작하고, 프로젝트가 커나감에 따라 hatch 를 우선적으로 고려하자.

</aside>


python build frontend vs python build backend?


parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.

  1. None

from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.

  1. bb2.1_2. title: 권한을 분리하기 위해 make 과 make install 을 분리한 것이다.
  2. deer.a8_2.1. title: 파이썬의 패키지 관리자 pip 는 패키지를 기본적으로 공개 레지스트리에서 찾는다. 비공개 레지스트리에서도 탐색을 할 수 있다.
  3. [bb7.1.1.2_1.2__2. title: 넷스케이프의 자바스크립트(JavaScript)와 마이크로소프트의 J스크립트(JScript) 차이를 줄이기 위해 에크마스크립트(ECMAScript (ES)) 라고 불리는 국제표준이 생겼다.](https://janghoo.notion.site/bb7-1-1-2_1-2__2-title-JavaScript-J-JScript-4abedc299997409490cbb052b3c1de0b)