PEP 627 – 설치된 프로젝트 기록
- Author:
- Petr Viktorin <encukou at gmail.com>
- BDFL-Delegate:
- Paul Moore <p.f.moore at gmail.com>
- Discussions-To:
- Discourse thread
- Status:
- Final
- Type:
- Standards Track
- Topic:
- Packaging
- Created:
- 15-Jul-2020
- Resolution:
- Discourse message
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP는 PEP 376(설치된 Python 배포본 데이터베이스)을 명확히 하고 업데이트하여 상호 운용성 표준으로 다시 작성합니다. 또한 표준의 정식 위치를 Python Packaging Authority (PyPA) 표준 저장소로 옮기고, 이를 변경하기 위한 지침을 마련합니다.
설치된 .dist-info 디렉터리의 두 파일을 선택 사항으로 합니다: RECORD (PEP 376에서는 필수로 열거하지만 “시스템 패키지”의 경우 생략할 수 있다고 제안합니다)와 INSTALLER입니다.
동기
Python 패키징은 특정 도구(Setuptools 및 pip)에 의존하는 방식에서 도구 생태계와 도구에 구애받지 않는 상호 운용성 표준을 지향하는 방식으로 이동하고 있습니다.
PEP 376은 상호 운용성 표준으로 작성된 것이 아닙니다. 특정 도구와 라이브러리의 구현 세부 사항을 설명하지만 사양이 충분히 정의되지 않아 구현에 따라 정의되는 동작에 많은 여지를 남깁니다.
이는 PEP 376에서 표준을 “정제하고”, 이를 명확히 하며, 도구에 구애받지 않도록 다시 작성하기 위한 제안입니다.
이 PEP의 목표는 반드시 완벽한 표준이 아니라 더 나은 표준을 마련하는 것입니다. 일부 문제는 추후 명확히 하도록 남겨 둡니다.
근거 변경 사항
PEP 376의 근거는 두 가지 문제에 초점을 맞춥니다.
- 프로젝트를 설치하는 방법이 너무 많아서 상호 운용이 어렵습니다.
- 설치된 배포본에 관한 정보를 가져올 API가 없습니다.
새 문서는 설치된 프로젝트 정보의 디스크상 형식에만 초점을 맞춥니다. 이 정보를 설치, 제거 또는 조회하기 위한 API의 제공은 도구에서 구현할 사항으로 남겨 둡니다.
표준 및 변경 절차
Recording installed projects(이전 명칭은 Database of Installed Python Distributions)의 정식 표준은 packaging.python.org의 documentation입니다. 사소한 언어 또는 활자체 수정 이외의 모든 문서 변경은 PEP 절차를 통해 이루어져야 합니다.
이 문서는 규범적이며, 이해를 돕기 위한 예제를 포함합니다. 이 문서를 변경하는 이 PEP와 같은 PEP에는 근거 및 호환성 고려 사항과 같이 최신 상태가 아니게 될 것으로 예상되는 추가 정보가 포함됩니다.
제안된 표준은 이 PEP와 함께 packaging.python.org에 풀 리퀘스트로 제출됩니다.
변경 사항 및 그 근거
“Recording installed projects”로 이름 변경
표준의 이름을 Database of Installed Python Distributions에서 Recording installed projects로 변경합니다.
디스크의 알려진 위치에 파일을 저장하는 것을 “데이터베이스”라고 생각할 수도 있지만, 대부분의 사람은 이 용어를 들었을 때 그렇게 생각하지 않습니다. PyPA는 Recording installed distributions라는 제목 아래에서 PEP 376로 연결합니다.
PyPA 용어집에서는 “배포”(또는 Linux 배포판 등과의 혼동을 방지하기 위해 “배포 패키지”)를 “버전이 지정된 아카이브 파일 […]”로 정의합니다. 아카이브 파일에서 Python 코드를 설치하는 방법 외에도 다른 방법이 있을 수 있으므로, 이 문서에서는 “설치된 배포본” 대신 “설치된 프로젝트”를 사용합니다.
구현 세부 사항 제거
도구 및 라이브러리와 관련된 모든 세부 사항을 제거합니다. 프로젝트를 설치하는 방식도 제외하며, 문서는 최종 상태에 중점을 둡니다. 한 가지 예외는 RECORD 파일의 목적을 더 잘 설명하기 위해 제시한 설치 제거 알고리즘의 개요입니다.
setuptools 및 distutils에 특화된 형식인 .egg-info 및 .egg에 대한 참조는 제외합니다.
추가 파일을 명시적으로 허용하기
.dist-info 디렉터리에는 사양에 지정되지 않은 파일도 포함할 수 있습니다. 현재 도구는 이미 이렇게 합니다.
사양의 한 주석에서는 wheels의 .dist-info 디렉터리에 있는 파일을 언급합니다. 현재 도구는 이러한 파일을 설치된 .dist-info로 복사하며, 이는 향후 표준화 작업에서 염두에 두어야 할 사항입니다.
RECORD 파일에 대한 명확화
CSV 방언은 Python의 csv 모듈에서 사용하는 기본값으로 지정됩니다. 이를 통해 파일 이름에서 큰따옴표와 줄 종결자를 처리할 때 발생하는 경계 사례가 해결됩니다.
RECORD의 상대 경로에 대한 “기준”은 도구별 --install-lib 및 --prefix 옵션이 아니라 .dist-info 디렉터리를 기준으로 지정됩니다.
hash 및 size 필드는 이제 선택 사항입니다(단지 .pyc, .pyo 및 RECORD뿐만 아니라 모든 파일에 해당합니다). *.pyc 및 RECORD 자체를 제외하면 이를 생략하는 것은 권장되지 않습니다. (참고로 PEP 376은 무엇이 선택 사항이었는지 명확하지 않으며, 이를 문자 그대로 해석하면 해당 문서의 내용과 예제가 서로 모순됩니다. 그럼에도 “두 필드 모두 선택 사항”이라는 해석은 PEP 376에 대한 합리적인 해석입니다. 대안은 어떤 파일을 해시와 크기 없이 기록할 수 있는지 권고하는 대신 의무화하고, 새로운 사용 사례가 생길 때마다 해당 목록을 갱신하는 것입니다.)
새 사양은 이제 RECORD 파일에 설치된 프로젝트의 모든 파일을 포함해야 한다고 명시합니다(.pyc 파일에 대한 예외는 유지됩니다). 도구는 설치 제거에 RECORD를 사용하므로, 불완전한 파일 목록으로 인해 사용자의 환경에 고아 파일이 남을 수 있습니다. 반면 이는 전체 파일 목록을 알 수 없는 경우 일부 파일의 해시를 기록할 방법이 없다는 의미입니다.
파일의 주요 목적과 내용을 명확히 하기 위해 설치 제거 알고리즘의 개요를 포함합니다.
도구는 RECORD 파일이 없는 프로젝트를 설치 제거하거나 제거해서는 안 됩니다(리눅스 배포판의 시스템 패키지 관리자처럼 외부 정보를 보유한 경우는 제외합니다).
Windows에서는 RECORD의 파일을 / 또는 \중 하나로 구분할 수 있습니다. PEP 376은 이 점이 명확하지 않았습니다. 한 곳에서는 슬래시를 사용하도록 규정하지만, Windows 관련 예제에서는 백슬래시를 보여 줍니다.
선택 사항인 RECORD 파일
RECORD 파일은 선택 사항이 됩니다. 모든 도구가 Python 전용 형식으로 설치된 파일 목록을 쉽게 생성할 수 있는 것은 아닙니다.
특히 Linux 시스템 패키징 시스템으로 프로젝트를 설치하는 경우에는 RECORD 파일이 불필요합니다. 이러한 시스템에는 파일을 추적하거나, 설치 제거하거나, 무결성을 검사하는 고유한 방법이 있기 때문입니다. RECORD 파일을 디스크 및 시스템 패키지 데이터베이스와 동기화된 상태로 유지해야 하는 것은 지나치게 취약하며, 현실과 일치하지 않는 RECORD 파일보다는 파일 자체가 없는 편이 낫습니다.
(공개하자면, 이 PEP의 작성자는 Fedora Linux 배포판에서 활동하는 RPM 패키저입니다.)
선택 사항인 INSTALLER 파일
INSTALLER 파일도 선택 사항으로 하며, 정보 제공 목적으로만 사용하도록 지정합니다. 이 파일은 여전히 설치 프로그램의 이름을 포함하는 한 줄짜리 텍스트 파일입니다.
이 파일은 원래 Python 설치 프로그램(pip)으로 설치된 프로젝트와 다른 패키지 관리자(예: dnf)로 설치된 프로젝트를 구분하기 위해 추가되었습니다. 설치하지 않은 패키지를 pip가 업데이트하거나 제거하지 못하도록 이 파일을 사용하려는 시도가 있었습니다.
우리의 목표는 상호 운용하는 도구를 지원하는 것이며, 어떤 도구가 패키지를 설치했는지에 따라 작업을 수행하는 것은 이러한 목표에 어긋납니다.
도구는 설치 프로그램 이름에 의존하는 대신 기능 감지를 사용해야 합니다. 현재 문서는 Python 도구가 프로젝트를 건드리지 못하게 하는 조잡한 방법을 제공합니다. 즉, RECORD 파일을 생략하는 것입니다.
반면 설치 프로그램 이름은 사용자에게 제공하는 힌트에서 유용할 수 있습니다.
파일의 새로운 목적에 맞추기 위해 새 사양에서는 소문자 식별자 대신 INSTALLER에 모든 ASCII 문자열을 허용합니다. 또한 사용 가능한 경우 명령줄 명령을 사용할 것을 제안합니다.
REQUESTED 파일: 사양에서 제거됨
이제 REQUESTED 파일은 도구별 확장으로 간주됩니다.
관련 PEP 376에 따라, 다른 프로젝트의 의존성을 충족하기 위해 자동으로 설치된 경우와 달리 사용자의 직접 요청으로 프로젝트가 설치된 경우에는 REQUESTED를 기록하도록 되어 있었습니다. 이 표시 파일이 없는 프로젝트는 더 이상 필요하지 않게 되면 제거할 수 있었습니다.
표준에도 불구하고, 기존의 많은 설치 도구(pip의 오래된 버전을 포함)는 이 파일을 전혀 작성하지 않습니다. “더 이상 필요하지 않을 때 제거해도 괜찮은” 프로젝트와, REQUESTED를 무시하는 도구에 의해 단순히 설치된 프로젝트 사이에는 아무런 구분이 없습니다. 따라서 이 파일은 (도구가 추가적인 비표준 정보를 사용할 수 있는 경우가 아니라면) 현재 원래 의도된 목적으로 사용할 수 없습니다.
설명
가능한 경우, name과 version과 같은 용어는 기존 명세에 대한 참조를 통해 한정됩니다.
보류된 아이디어
이 PEP의 범위를 제한하기 위해, 일부 개선 사항은 명시적으로 향후 PEP로 미뤄집니다:
RECORD파일의 인코딩.dist-info에 나타날 수 있는 파일 제한 또는 네임스페이스화- 사용자 요청으로 직접 설치된 프로젝트와 의존성을 충족하기 위해 설치된 프로젝트 사이의 차이를 표시하여, 후자를 더 이상 필요하지 않을 때 제거할 수 있도록 하는 것
Copyright
This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.