Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 710 – 설치된 패키지의 출처 기록

Author:
Fridolín Pokorný <fridolin.pokorny at gmail.com>
Sponsor:
Donald Stufft <donald at stufft.io>
PEP-Delegate:
Paul Moore <p.f.moore at gmail.com>
Discussions-To:
Discourse thread
Status:
Draft
Type:
Standards Track
Topic:
Packaging
Created:
27-Mar-2023
Post-History:
03-Dec-2021, 30-Jan-2023, 14-Mar-2023, 03-Apr-2023

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

이 PEP는 설치된 Python 배포판의 출처를 기록하는 방법을 설명합니다. 이 기록은 설치 프로그램이 생성하며, 사용자는 .dist-info 디렉터리의 JSON 파일 provenance_url.json 형식으로 이용할 수 있습니다. 언급된 JSON 파일은 설치된 배포판 해시와 함께 distribution package의 URL을 기록할 수 있도록 추가 메타데이터를 담습니다. 이 제안은 PEP 610을 기반으로 하며 해당하는 PyPA 표준 사양을 따르고, 패키지가 이름과 선택적으로 버전으로 식별되는 경우 direct_url.jsonprovenance_url.json으로 보완합니다.

동기

Python Project를 설치하려면 Distribution PackagePackage Index에서 다운로드하고 그 콘텐츠를 적절한 위치에 추출해야 합니다. 설치 과정이 완료되면 사용된 릴리스 아티팩트와 그 출처에 관한 정보는 일반적으로 사라집니다. 그러나 패키지 설치에 사용된 배포판과 그 출처를 기록해 두어야 하는 사용 사례가 있습니다.

Python 휠은 서로 다른 컴파일러 플래그를 사용하거나 서로 다른 휠 태그를 지원하도록 빌드할 수 있습니다. 두 경우 모두 설치 프로그램이 여러 휠을 고려할 수 있는 상황(서로 다른 패키지 색인에서 가져온 것일 수도 있음)이 발생할 수 있으며, 설치 중 실제로 사용된 휠 파일이 무엇인지 즉시 알아내는 것이 도움이 될 수 있습니다. 이를 통해 개발자는 휠에 관한 정보를 사용하여 문제를 디버깅하고, 원하는 휠이 실제로 설치되었는지 확인할 수 있습니다. 또 다른 사용 사례로는 설치된 소프트웨어를 보고하는 도구, 예를 들어 SBOM(Software Bill of Materials)을 보고하는 도구가 있으며, 이러한 도구는 더 정확한 보고서를 제공할 수 있습니다. 또 다른 사용 사례로는 각 설치된 패키지를 Python 패키지 색인에서 사용된 특정 배포 아티팩트에 고정하여 Python 환경을 재구성하는 것이 있을 수 있습니다.

근거

이 PEP에서 설명하는 동기는 설치된 배포판의 직접 URL 출처 기록사양의 확장입니다. 직접 URL을 사용하여 설치된 패키지의 출처 정보를 기록하는 것에 더해, 설치 프로그램은 Python 패키지 색인에서 이름(및 선택적으로 버전)으로 설치된 패키지에 대해서도 같은 작업을 수행해야 합니다.

이 PEP에서 설명하는 아이디어는 컨테이너화된 환경에서 distribution packages를 설치하는 데 사용되는 micropipenv라는 도구에서 비롯되었습니다(보고된 이슈 thoth-station/micropipenv#206를 참조하십시오). 현재 조립된 컨테이너화 애플리케이션에는 설치된 배포 패키지의 출처 정보가 암묵적으로 포함되지 않습니다(전체 URL에서 설치되고 direct_url.json을 통해 기록된 경우는 제외합니다). 따라서 컨테이너화된 환경에 존재하는 소프트웨어를 감사해야 하는 경우, 컨테이너 이미지 공급자는 요구 사항 파일을 확인할 수 있도록 컨테이너 이미지를 해당 빌드 과정, 그 구성 및 애플리케이션 소스 코드와 연결해야 합니다.

Discourse 스레드의 후속 논의에서는 설치 과정에 관한 상세한 JSON 보고서를 생성할 수 있는 pip의 새로운 --report 옵션도 언급되었습니다. 이 옵션은 이 PEP가 다루는 출처 문제에 도움이 될 수 있습니다. 그럼에도 출처 정보를 얻으려면 이 옵션을 pip에 명시적으로 전달해야 하며, 출처 확인에 필요하지 않을 수도 있는 추가 메타데이터(예: 각 배포 패키지의 Python 버전 요구 사항)도 포함합니다. 또한 이 PEP가 작성되는 시점에는 이 옵션이 pip에만 해당합니다.

현재 설치된 패키지 기록 사양에서는 설치된 파일을 기록하는 RECORD 파일을 정의하지만, 이러한 파일을 제공한 배포 아티팩트는 기록하지 않는다는 점에 유의하십시오. 설치된 아티팩트의 감사는 RECORD 파일에 나열된 항목을 대조하여 수행할 수 있습니다. 그러나 이 기법에는 각 아티팩트가 제공하는 파일의 사전 계산된 데이터베이스 또는 실제 아티팩트 콘텐츠와의 비교가 필요합니다. 제안된 provenance_url.json 파일을 사용하면 상대적으로 비용과 시간이 많이 드는 이 두 작업을 모두 제거할 수 있습니다.

직접 URL에서 얻은 배포 패키지와 색인에서 이름/버전으로 얻은 배포 패키지 모두에 대한 출처 정보를 기록하면, 앞서 언급한 컨테이너화 애플리케이션의 구체적인 사용 사례를 넘어 일반적으로 Python 환경 감사를 간소화할 수 있습니다. 커뮤니티 프로젝트 pip-audit에서 pypa/pip-audit#170에 잠재적인 관심을 표명했습니다.

사양

이 문서의 “MUST”, “MUST NOT”, “REQUIRED”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY” 및 “OPTIONAL” 키워드는 RFC 2119에 설명된 대로 해석해야 합니다.

설치 프로그램은 이름으로 지정된 Distribution Package(선택적으로 Version Specifier도 지정 가능)를 설치할 때 provenance_url.json 파일을 .dist-info 디렉터리에 생성해야 합니다.

직접 URL 참조(VCS URL 포함)를 지정하는 요구 사항에서 배포 패키지를 설치할 때는 이 파일을 생성해서는 안 됩니다.

주어진 .dist-info 디렉터리에는 Recording the Direct URL Origin of installed distributions 사양 및 이에 대응하는 Direct URL Data Structure 사양에 따른 provenance_url.jsondirect_url.json 파일 중 하나만 존재할 수 있으며, 설치자는 둘 다 추가해서는 안 됩니다.

provenance_url.json JSON 파일은 RFC 8259를 준수하는 UTF-8 인코딩 딕셔너리여야 합니다.

존재하는 경우 정확히 두 개의 키를 포함해야 합니다. 첫 번째 키는 url이고 타입은 string이어야 합니다. 두 번째 키는 archive_info이어야 하며, 값은 아래에 정의된 것이어야 합니다.

url 키의 값은 배포 패키지를 다운로드한 URL이어야 합니다. 휠을 소스 배포판에서 빌드한 경우 url 값은 소스 배포판을 다운로드한 URL이어야 합니다. 휠을 다운로드하여 직접 설치한 경우 url 필드는 휠을 다운로드한 URL이어야 합니다. 보안상의 이유로, Direct URL Data Structure 사양에서와 마찬가지로 url값에서 민감한 인증 정보를 제거해야 합니다.

그러나 URL의 user:password 부분은 다음 정규 표현식과 일치하는 환경 변수로 구성될 수 있습니다:

\$\{[A-Za-z0-9-_]+\}(:\$\{[A-Za-z0-9-_]+\})?

또한 URL의 user:password 부분은 널리 알려진 보안상 민감하지 않은 문자열일 수 있습니다. 대표적인 예는 git이며, ssh://git@gitlab.com과 같은 URL의 경우입니다.

archive_info 값은 단일 키 hashes를 가진 딕셔너리여야 합니다. hashes 값은 해시 함수 이름을 url 값이 참조하는 파일의 16진수로 인코딩된 다이제스트에 매핑하는 딕셔너리입니다. 최소 하나의 해시는 기록되어야 합니다. 여러 해시를 포함할 수 있으며, 여러 해시를 어떻게 처리할지는 소비자가 결정합니다(모두 또는 일부를 검증하거나, 전혀 검증하지 않을 수 있습니다).

각 해시는 hashlib.algorithms_guaranteed가 제공하는 단일 인자 해시 중 하나여야 하며, 사용해서는 안 되는 sha1md5는 제외합니다. Python 3.11 기준으로, 다중 인자를 사용하므로 shake_128shake_256을 제외하면 허용되는 해시 집합은 다음과 같습니다:

>>> import hashlib
>>> sorted(hashlib.algorithms_guaranteed - {"shake_128", "shake_256", "sha1", "md5"})
['blake2b', 'blake2s', 'sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512']

각 해시는 항상 소문자로 표기되는 해시의 정식 이름으로 참조되어야 합니다.

이러한 해시 알고리즘의 보안상 한계로 인해 sha1md5는 존재해서는 안 됩니다. 반대로 sha256은 포함하는 것이 좋습니다.

패키지 색인에서 배포 패키지를 캐시하는 설치 프로그램은 캐시된 배포 아티팩트와 관련된 정보를 유지해야 하며, 이를 통해 설치 프로그램의 캐시에서 배포 패키지를 설치할 때도 provenance_url.json 파일을 생성할 수 있어야 합니다.

하위 호환성

다음의 Recording installed projects 사양에 따라, 설치 도구는 .dist-info 디렉터리에 설치 도구별 추가 파일을 보관할 수 있습니다. 이 PEP가 하위 호환성 문제를 일으키지 않도록 하기 위해 수행한 설치 프로그램 및 라이브러리에 대한 종합 조사에서는 이와 유사한 이름의 파일을 사용하는 현재 도구나 기타 주요 실현 가능성 문제가 없는 것으로 나타났습니다.

해당 Wheel specification사양에는 .dist-info 디렉터리에 존재할 수 있는 파일이 나열되어 있습니다. 이러한 파일 이름 중 어느 것도 이 PEP에서 제안한 provenance_url.json 파일과 충돌하지 않습니다.

설치 프로그램 및 라이브러리에서의 provenance_url.json 존재

Python 생태계에 존재하는 설치 관리자, 라이브러리 및 의존성 관리자를 대상으로 한 종합적인 조사에서는 각 도구에 provenance_url.json 지원을 추가하는 것의 영향을 분석했습니다. 요약하면, 이 PEP를 작성하는 시점까지 중대한 하위 호환성 문제, 충돌 또는 실현 가능성을 가로막는 요인은 발견되지 않았습니다. 조사에 대한 자세한 내용은 Appendix: Survey of installers and libraries 섹션에서 확인할 수 있습니다.

direct_url.json과의 호환성

이 제안은 PEP 610에 설명된 direct_url.json 파일과 해당하는 정식 PyPA 사양 을 변경하지 않습니다.

provenance_url.json 파일의 콘텐츠는 direct URL이 소스 아카이브 또는 휠을 가리킬 때 설치 관리자가 최종적으로 direct_url.json을지원하는 일부 로직을 재사용할 수 있도록 설계되었습니다.

provenance_url.json 파일과 direct_url.json 파일의 주요 차이는 provenance_url.json 파일에서 필수 키와 해당 값이 존재한다는 점입니다. 이를 통해 .dist-info 디렉터리에 파일이 존재하는 경우 provenance_url.json 파일의 소비자가 해당 콘텐츠를 신뢰할 수 있습니다.

보안 관련 사항

provenance_url.json 파일의 주요 보안 기능 중 하나는 Python 환경에 설치된 아티팩트를 감사할 수 있는 기능입니다. 도구는 Python distribution packages를 설치하는 데 어떤 Python 패키지 색인이 사용되었는지와 릴리스 아티팩트의 해시 다이제스트를 확인할 수 있습니다.

예를 들어 최근 발생한 PyTorch incident의 손상된 의존성 체인을 살펴볼 수 있습니다. PyTorch 색인은 torchtriton이라는 이름의 패키지를 제공했습니다. 공격자는 PyPI에 torchtriton을 게시했고, 이 패키지는 악성 바이너리를 실행했습니다. 도구는 provenance_url.json 파일에 명시된 설치된 Python 배포 패키지의 URL을 확인하여 설치된 Python 배포 패키지의 출처를 자동으로 확인할 수 있습니다. PyTorch 사건의 경우 torchtriton의 URL은 PyPI가 아니라 PyTorch 색인을 가리켜야 합니다. 도구는 설치된 Python 배포 패키지의 URL을 확인하여 이와 같은 악성 Python 배포 패키지가 설치되었는지 식별하는 데 도움을 줄 수 있습니다. 보다 정확한 확인에는 provenance_url.json 파일에 명시된 설치된 Python 배포 패키지의 해시도 포함될 수 있습니다. 이러한 해시 확인은 소스 URL로는 Python 배포 패키지를 구별할 수 없는 미러링된 Python 패키지 색인에 유용하며, 원하는 Python 패키지 배포 패키지만 설치되도록 보장할 수 있습니다.

악의적인 행위자는 설치된 Python 배포 패키지의 출처 정보를 숨기기 위해 provenance_url.json의 콘텐츠를 의도적으로 조정할 수 있습니다. 이러한 악의적 활동을 밝혀낼 수 있는 보안 검사는 파일 시스템에서 수행되는 작업을 모니터링하고 최종적으로 사용자 또는 파일 권한을 검토해야 하므로 이 PEP의 범위를 벗어납니다.

이 내용을 가르치는 방법

provenance_url.json 메타데이터 파일은 도구를 위한 것이며 최종 사용자에게 직접 표시되지 않습니다.

예제

유효한 provenance_url.json의 예

여러 해시를 나열하는 유효한 provenance_url.json 목록:

{
  "archive_info": {
    "hashes": {
      "blake2s": "fffeaf3d0bd71dc960ca2113af890a2f2198f2466f8cd58ce4b77c1fc54601ff",
      "sha256": "236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f",
      "sha3_256": "c856930e0f707266d30e5b48c667a843d45e79bb30473c464e92dfa158285eab",
      "sha512": "6bad5536c30a0b2d5905318a1592948929fbac9baf3bcf2e7faeaf90f445f82bc2b656d0a89070d8a6a9395761f4793c83187bd640c64b2656a112b5be41f73d"
    }
  },
  "url": "https://files.pythonhosted.org/packages/07/51/2c0959c5adf988c44d9e1e0d940f5b074516ecc87e96b1af25f59de9ba38/pip-23.0.1-py3-none-any.whl"
}

단일 해시 항목을 나열하는 유효한 provenance_url.json:

{
  "archive_info": {
    "hashes": {
      "sha256": "236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f"
    }
  },
  "url": "https://files.pythonhosted.org/packages/07/51/2c0959c5adf988c44d9e1e0d940f5b074516ecc87e96b1af25f59de9ba38/pip-23.0.1-py3-none-any.whl"
}

휠을 빌드하고 설치하는 데 사용된 소스 배포 패키지를 나열하는 유효한 provenance_url.json:

{
  "archive_info": {
    "hashes": {
      "sha256": "8bfe29f17c10e2f2e619de8033a07a224058d96b3bfe2ed61777596f7ffd7fa9"
    }
  },
  "url": "https://files.pythonhosted.org/packages/1d/43/ad8ae671de795ec2eafd86515ef9842ab68455009d864c058d0c3dcf680d/micropipenv-0.0.1.tar.gz"
}

유효하지 않은 provenance_url.json의 예

다음 예제에는 Recording the Direct URL Origin of installed distributions에서 설명하는 데이터 구조에서 원래 설계된 대로 archive_info 딕셔너리에 hash 키가 포함되어 있습니다. hash 키가 존재해서는 안 되는 이유는 hashes와 해시 값의 동기화를 유지하기 위해 필요한 추가 검사와 혼동할 가능성을 방지하기 위해서입니다.

{
  "archive_info": {
    "hash": "sha256=236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f",
    "hashes": {
      "sha256": "236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f"
    }
  },
  "url": "https://files.pythonhosted.org/packages/07/51/2c0959c5adf988c44d9e1e0d940f5b074516ecc87e96b1af25f59de9ba38/pip-23.0.1-py3-none-any.whl"
}

또 다른 예에서는 유효하지 않은 해시 이름을 보여 줍니다. 참조된 해시 이름은 이 PEP와 Python 문서의 hashlib.hash.name에 설명된 표준 해시 이름에 해당하지 않습니다.

{
  "archive_info": {
    "hashes": {
      "SHA-256": "236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f"
    }
  },
  "url": "https://files.pythonhosted.org/packages/07/51/2c0959c5adf988c44d9e1e0d940f5b074516ecc87e96b1af25f59de9ba38/pip-23.0.1-py3-none-any.whl"
}

마지막 예에서는 다운로드한 아티팩트에 사용할 수 있는 해시가 없는 provenance_url.json 파일을 보여 줍니다:

{
  "archive_info": {
    "hashes": {}
   }
  "url": "https://files.pythonhosted.org/packages/07/51/2c0959c5adf988c44d9e1e0d940f5b074516ecc87e96b1af25f59de9ba38/pip-23.0.1-py3-none-any.whl"
}

예시 pip 명령과 provenance_url.json 및 direct_url.json에 미치는 영향

이러한 명령은 direct_url.json 파일을 생성하지만 provenance_url.json 파일은 생성하지 않습니다. 이러한 예시는 Direct URL Data Structure 사양의 예시를 따릅니다:

  • pip install https://example.com/app-1.0.tgz
  • pip install https://example.com/app-1.0.whl
  • pip install "git+https://example.com/repo/app.git#egg=app&subdirectory=setup"
  • pip install ./app
  • pip install file:///home/user/app
  • pip install --editable "git+https://example.com/repo/app.git#egg=app&subdirectory=setup" (이 경우 url은 git 저장소가 복제된 로컬 디렉터리가 되며, dir_info가 존재하고 "editable": true가 설정되며 vcs_info는 설정되지 않습니다)
  • pip install -e ./app

provenance_url.json 파일을 생성하지만 direct_url.json 파일은 생성하지 않는 명령:

  • pip install app
  • pip install app~=2.2.0
  • pip install app --no-index --find-links "https://example.com/"

이 동작은 PR pypa/pip#11865에서 구현된 pip 변경 사항을 사용하여 테스트할 수 있습니다.

참조 구현

Python Distribution Package를 설치할 때 provenance_url.json 메타데이터 파일을 생성하는 개념 증명이 pip PR pypa/pip#11865에서 제공됩니다. 이는 direct URL data structure에 이미 제공된 구현을 재사용하여 direct_url.json이 생성되지 않는 경우에 provenance_url.json 메타데이터 파일을 제공합니다.

PDM에서 provenance_url.json 파일을 지원하는 참조 구현은 pdm-project/pdm#3013에 존재하며 이용할 수 있습니다.

pip-preserve라는 프로토타입은 direct_url.jsonprovenance_url.json 메타데이터 파일을 고려하여 requirements.txt 파일을 생성하는 것을 보여 주기 위해 개발되었습니다. 이 도구는 pip freeze기능을 모방하지만, 설치된 패키지 목록에는 Python 배포 아티팩트의 해시도 포함됩니다.

이 제안을 더욱 뒷받침하기 위해 pip-sbom는 SPDX 형식의 SBOM 생성을 보여 줍니다. 이 도구는 provenance_url.json파일에 저장된 정보를 사용합니다.

거부된 아이디어

provenance_url.json 대신 direct_url.json으로 파일 이름 지정

하위 호환성을 유지하려면 Recording the Direct URL Origin of installed distributions에 따라 해당 사양의 내용에서 설명하듯이 파일 이름을 direct_url.json으로 지정할 수 없습니다:

다른 유형의 요구 사항(즉, 이름과 버전 지정자)에서 배포 패키지를 설치할 때는 이 파일을 생성해서는 안 됩니다.

이러한 변경은 배포 패키지가 직접 URL 참조를 사용하여 설치된 경우에만 direct_url.json의 존재를 전제로 하는 해당 파일의 소비자에게 하위 호환성 문제를 일으킬 수 있습니다.

direct_url.json 사용 중단 및 provenance_url.json만 사용

direct_url.json 파일은 Direct URL Data Structure 사양에 의해 이미 널리 정립되어 있으며 설치 프로그램에서 이미 사용됩니다. 예를 들어, pippip freeze에서 직접 URL 참조를 보고하기 위해 direct_url.json을 사용합니다. direct_url.json을 더 이상 사용하지 않도록 하려면 pip의 pip freeze 구현을 추가로 변경해야 하며( PR fridex/pip#2 참조), 이미 존재하는 direct_url.json 소비자와의 하위 호환성 문제가 발생할 수 있습니다.

archive_info 딕셔너리에 hash 키 유지하기

Direct URL Data Structure 사양에서는 archive_info 딕셔너리에 hashes 키와 함께 hash 키를 포함할 가능성을 논의합니다. 이 PEP에서는 provenance_url.json 파일에 hash 키를 명시적으로 포함하지 않으며 hashes 키만 존재하도록 허용합니다. 이렇게 함으로써 파일 내의 잠재적인 중복과 혼란, 그리고 해시가 서로 일치하는지 확인하기 위해 수행해야 하는 추가 검사를 제거합니다.

해시를 명시하지 않도록 허용하기

휠 파일이 pip의 캐시에서 설치되고 이전 버전의 pip를 사용하여 빌드된 경우, pip는 다운로드한 소스 배포판의 해시를 기록하지 않습니다. 이러한 다운로드한 소스 배포판의 해시를 보유하지 않으므로 provenance_url.json 파일의 hashes 키에는 항목이 포함되지 않습니다. 이러한 경우 provenance 정보가 완전하지 않으므로 pip는 provenance_url.json 파일을 생성하지 않습니다. 이러한 경우 소비자는 최신 버전의 pip로 휠을 다시 빌드하는 것이 권장됩니다.

uv는 명시적으로 요구하지 않는 한 배포판 해시를 계산하지 않으므로, uv 개발자들은 provenance_url.json 파일에 최소 하나의 해시를 요구해야 한다는 우려를 제기했습니다. 그러나 최소 하나의 해시를 요구하면 배포판의 무결성 검사에 도움이 됩니다. 이는 잠금 파일을 사용하는 시나리오나 SBOM의 일부로 배포판을 식별하는 경우에 중요합니다. provenance_url.json 파일에는 다운로드한 배포판에 대한 최소 하나의 해시를 포함해야 합니다. 설치 과정에서 배포판의 해시를 계산하지 않는 설치 프로그램은(예: 성능상의 이유로) provenance_url.json 파일을 생성하지 않아도 됩니다.

hashes 키를 선택 사항으로 만들기

PEP 610이에 대응하는 정식 PyPA 사양direct_url.json 파일의 archive_infohashes 키를 포함할 것을 권장하지만, RFC 2119의 표현에 따르면 필수는 아닙니다.

hashes 키는 해시 이름을 파일의 16진수로 인코딩된 다이제스트에 매핑하는 딕셔너리로 존재해야 합니다.

이 PEP에서는 provenance_url.json 파일이 생성되는 경우 archive_infohashes 키를 포함하도록 요구하며, 이 PEP에 따르면 다음과 같습니다.

archive_info의 값은 단일 키 hashes를 갖는 딕셔너리여야 합니다.

그렇게 함으로써 설치자가 provenance_url.json 파일을 생성할 때 provenance_url.json의 사용자는 아티팩트 다이제스트를 확인할 수 있습니다.

색인 URL 저장하기

색인 URL을 파일 내용의 일부로 저장하는 가능성이 제기되었습니다. 이 색인 URL은 pip 구성에서 설정되거나 --index-url 또는 --extra-index-url 옵션으로 지정된 색인을 나타냅니다. 특히 --find-links와 같은 다른 설치 옵션을 사용하는 경우 이 정보를 저장하면 혼란을 일으킬 수 있다고 판단했습니다. 실제 색인 URL은 휠 파일이 다운로드된 위치에 엄밀히 연결되어 있지 않으므로 provenance_url.json 파일에 색인 URL을 저장하지 않기로 결정했습니다.

미해결 문제

Conda에서 provenance_url.json 파일 사용 가능 여부

Conda 유지 관리자들로부터 provenance_url.json 파일에 대한 피드백을 받고자 합니다. Conda가 provenance_url.json 파일을 채택하려는지는 명확하지 않습니다. Conda는 이미 (이 PEP에서 제안된 provenance 정보와 유사한) provenance 관련 정보를 설치 중 수행한 작업에 따르는 conda-meta 디렉터리에 있는 JSON 파일에 저장합니다.

다운스트림 설치 관리자에서 provenance_url.json 사용

제안된 provenance_url.json 파일은 주로 Python 설치 관리자에서 채택하도록 의도되었습니다. APT나 DNF와 같은 다른 설치 관리자들은 다운스트림 패키지 관리에 특화된 자체적인 방식으로 설치된 다운스트림 Python 배포판의 provenance를 기록할 수 있습니다. 이러한 다운스트림 패키지 설치 관리자들이 제안된 파일을 생성할 것으로 예상되지 않으므로, 이들은 의도적으로 이 PEP에서 제외되었습니다. 그러나 이러한 설치 관리자의 개발자나 유지 관리자가 제공하는 모든 의견은 어떤 방식으로든 도움이 될 정보를 provenance_url.json 파일에 추가할 가능성을 높이는 데 가치가 있습니다.

부록: 설치 관리자 및 라이브러리 조사

pip

휠 설치를 담당하는 pip 내부 API의 함수인 _install_wheel 함수는 .dist-info 디렉터리에 provenance_url.json 파일을 저장하지 않습니다. 또한 언급된 파일을 pip에 도입하는 pypa/pip#11865프로토타입은 pip 소스 코드에 provenance_url.json 파일을 처리하는 로직을 통합하는 방법을 보여 줍니다.

pip는 아래에 언급된 일부 도구에서 Python 패키지 배포판을 설치하는 데 사용되므로 pip에 대한 조사 결과는 이러한 도구에도 적용되며, pip는 내부 API에서 .dist-info 디렉터리에 파일을 생성하는 작업을 매개변수화하는 것을 허용하지 않습니다. pip를 사용하는 아래의 대부분 도구는 pip를 서브프로세스로 호출하며, 이는 .dist-info 디렉터리에 provenance_url.json 파일이 최종적으로 존재하는지 여부에 영향을 주지 않습니다.

distlib

distlibdist-info 디렉터리를 조작하는 저수준 기능을 구현합니다. 설치된 배포판의 데이터베이스는 distlib 소스 코드에 근거할 때 provenance_url.json이라는 이름의 파일을 사용하지 않습니다.

Pipenv

PipenvPython 패키지 배포판을 설치하기 위해 pip를 사용합니다. .dist-info 디렉터리에 provenance_url.json 파일을 도입할 때 하위 호환성 문제를 일으킬 것으로 식별된 추가 로직은 없었습니다.

installer

installerprovenance_url.json 파일을 명시적으로 생성하지 않습니다. 그럼에도 불구하고 설치된 프로젝트 기록하기 사양에 따라 installer는 .dist-info 디렉터리에 파일을 생성하기 위해 additional_metadata 인자를 전달하는 것을 허용합니다. 소스 코드를 참조하십시오. 하위 호환성 문제를 피하려면 installer를 사용하는 모든 라이브러리나 도구는 앞서 언급한 additional_metadata 인자를 사용하여 provenance_url.json 파일을 생성하도록 요청해서는 안 됩니다.

Poetry

Poetry의 설치 로직은 installer.modern-installer 구성 옵션에 따라 달라집니다(문서 참조).

installer.modern-installer 구성 옵션이 false로 설정된 경우 Poetry는 Python 패키지 배포판을 설치하기 위해 pip를 사용합니다.

반면 installer.modern-installer 구성 옵션이 true로 설정된 경우 Poetry는 Python 패키지 배포판을 설치하기 위해 installer를 사용합니다. 링크된 소스에서 볼 수 있듯이, 이 PEP와의 호환성 문제를 일으킬 수 있는 provenance_url.json이라는 이름의 추가 메타데이터 파일은 전달되지 않습니다.

Conda

CondaPython 패키지 배포판이 설치될 때 provenance_url.json 파일을 생성하지 않습니다.

Hatch

Hatch는 pip를 프로젝트 의존성을 설치하기 위해 사용합니다.

micropipenv

micropipenv는 pip를 기반으로 하는 래퍼이므로, 잠금 파일요구 사항 파일 모두에 대해 Python 배포판을 설치하는 데 pip를 사용합니다.

Thamos

Thamos는 micropipenv를 Python 패키지 배포판을 설치하기 위해 사용하므로, micropipenv에 대한 모든 결과가 Thamos에도 적용됩니다.

PDM

PDM바이너리 배포판을 설치하기 위해 installer를 사용합니다. 결국 .dist-info 디렉터리에 생성하는 유일한 추가 메타데이터 파일은 REFER_TO 파일입니다.

uv

uv는 Rust로 작성되었으며, wheel을 설치할 때 자체 설치 로직을 사용합니다. .dist-info 디렉터리에 추가 파일을 생성하지 않으므로, provenance_url.json 파일 명명과 충돌할 수 없습니다.

참고 자료

감사의 말

이 아이디어가 처음 나온 논의를 진행해 주신 Dustin Ingram, Brett Cannon, Paul Moore에게 감사드립니다.

이 PEP 작업에 대한 초기 피드백과 지원을 제공해 주신 Donald Stufft, Ofek Lev, Trishank Kuppusamy에게 감사드립니다.

Gregory P.에게 감사드립니다. Smith, Stéphane Bidoul, C.A.M. Gerlach 및 Adam Turner가 이 PEP를 검토하고 귀중한 제안을 제공해 주신 데 감사드립니다.

지원과 귀중한 제안을 제공해 주시고 제안된 pip-sbom 프로토타입을 제시해 주신 Seth Michael Larson에게 감사드립니다.

Stéphane Bidoul과 Chris Jerdonek에게 PEP 610 및 관련 Recording the Direct URL Origin of installed distributionsDirect URL Data Structure 사양에 대해 감사드립니다.

provenance_url.json 파일에 패키지 색인 URL을 저장하는 것에 대한 우려를 제기하고 PDM에서 PEP 710을 초기 지원해 주신 Frost Ming에게 감사드립니다.

uv 설치 프로그램과 관련된 의견을 제공해 주신 Charlie Marsh와 Zanie Blue에게 감사드립니다.

마지막으로, 이 PEP를 후원해 주신 Donald Stufft에게 감사드립니다.