[Rejected] PEP 390 - Static metadata for Distutils

원문 링크: PEP 390 - Static metadata for Distutils

상태: Rejected 유형: Standards Track 작성일: 10-Oct-2009

PEP 390 – Distutils를 위한 정적 메타데이터

  • 작성자: Tarek Ziadé
  • BDFL-Delegate: Alyssa Coghlan
  • 상태: Rejected (거부됨)
  • 유형: Standards Track
  • 주제: Packaging
  • 생성일: 2009년 10월 10일
  • Python 버전: 2.7, 3.2

개요 (Abstract)

이 PEP는 setup.cfg 파일에 새로운 섹션과 형식을 정의하여, setup.py를 사용하지 않고도 패키지의 메타데이터를 설명할 수 있도록 제안했습니다.

거부 공지 (Rejection Notice)

Distutils2가 표준 라이브러리에 통합되지 않게 됨에 따라, 이 PEP는 2013년 4월 말 Alyssa Coghlan에 의해 거부되었습니다.

이 PEP를 대체할 PEP는 PEP 426 (메타데이터 2.0)을 기반으로 생성될 예정이며, 소스 tarball 또는 VCS 체크아웃에서 sdist 아카이브를 생성하는 데 필요한 최소한의 정보를 정의할 것입니다.

제안 배경 (Rationale)

현재, 설치되지 않은 배포판의 모든 메타데이터 (PEP 314 참조)를 확인하려면 setup.py 명령줄 인터페이스를 사용해야 합니다.

예를 들어, 다음과 같이 실행해야 합니다:

$ python setup.py --name Distribute
$ python setup.py --version 0.6.4

nameversion은 메타데이터 필드입니다. 이 방식은 잘 작동하지만, 개발자들이 setup.py에 더 많은 코드를 추가할수록 이 기능이 제대로 작동하지 않거나, 최악의 경우 대상 시스템에서 원치 않는 작업을 수행할 수도 있습니다.

더욱이, OS 패키저가 재패키징하려는 배포판의 메타데이터를 얻으려 할 때, 그들이 작업하는 setup.py 파일을 이해하는 데 어려움을 겪을 수 있습니다.

따라서 이 PEP의 목표는 setup.py와 함께 정적 구성 파일에 메타데이터를 선언하는 방법을 제공하여, 서드파티 코드(third-party code) 실행 없이 메타데이터를 얻을 수 있도록 하는 것이었습니다.

setup.cfg에 메타데이터 섹션 추가 (Adding a metadata section in setup.cfg)

이 PEP는 setup.cfg 파일에 [metadata] 섹션을 도입하여 메타데이터의 모든 필드를 포함할 수 있도록 제안했습니다.

예시:

[metadata]
name = Distribute
version = 0.6.4

setup.cfg 파일은 Distutils에서 또 다른 구성 파일을 추가하는 것을 피하기 위해 사용됩니다. 이 파일은 명령이 실행될 때 Distutils에 의해 이미 읽히며, [metadata] 섹션이 발견되면 메타데이터 필드를 채우는 데 사용됩니다. setup() 함수에 메타데이터 필드에 해당하는 옵션이 주어지면, setup.cfg에 있던 값을 재정의합니다.

setup.py는 여전히 사용되며, 메타데이터 필드의 일부가 아닌 옵션(예: sdist 명령의 packages 또는 scripts 옵션)을 정의하는 데 필요할 수 있습니다.

다중 라인 값 (Multi-lines values)

일부 메타데이터 필드는 여러 값을 가질 수 있습니다. setup.cfgConfigParser 및 RFC 822 LONG HEADER FIELDS (섹션 3.1.1 참조)와 호환되도록, 이러한 값들은 쉼표(,)로 구분됩니다.

예시:

requires = pywin32, bar > 1.0, foo

이 변수가 읽힐 때, 값들은 파싱되어 리스트(['pywin32', 'bar > 1.0', 'foo'])로 변환됩니다.

컨텍스트 종속 섹션 (Context-dependant sections)

[metadata] 섹션은 컨텍스트 종속 섹션(context-dependant sections)을 사용할 수도 있었습니다. 컨텍스트 종속 섹션은 실행 환경에 대한 조건을 포함하는 섹션입니다.

예시:

[metadata]
name = Distribute
version = 0.6.4
[metadata:sys_platform == 'win32']
requires = pywin32, bar > 1.0
obsoletes = pywin31
[metadata:os_machine == 'i386']
requires = foo
[metadata:python_version == '2.4' or python_version == '2.5']
requires = bar
[metadata:'linux' in sys_platform]
requires = baz

[metadata:condition] 섹션은 파일이 읽힐 때 조건이 충족될 경우에만 사용됩니다. 이러한 컨텍스트 종속 섹션의 배경 동기는 배포판이 설치될 플랫폼에 따라 달라지는 요구 사항을 정의할 수 있도록 하는 것이었습니다 (PEP 314 참조).

이를 위한 마이크로 언어(micro-language)는 가장 간단한 형태였습니다: 문자열만 비교하며, ==in 연산자 (및 그 반대)와 표현식을 결합하는 기능을 가졌습니다. 이는 Python 개발자가 아닌 사람들도 쉽게 이해할 수 있도록 했습니다.

의사 문법(pseudo-grammar)은 다음과 같습니다: EXPR [in|==|!=|not in] EXPR [or|and] ...

여기서 EXPR은 다음 중 하나에 해당합니다:

  • python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1])
  • os_name = os.name
  • sys_platform = sys.platform
  • platform_version = platform.version()
  • platform_machine = platform.machine()
  • 2.4 또는 win32와 같은 자유 문자열

in 연산자는 문자열로 제한되었으며, 이는 튜플이나 리스트와 같은 다른 시퀀스를 오른쪽에 사용할 수 없음을 의미합니다.

Distutils는 setup.cfg 파일이 주어졌을 때 실행 환경에 대한 배포판의 메타데이터를 생성할 수 있는 함수를 제공할 예정이었습니다:

>>> from distutils.util import local_metadata
>>> local_metadata('setup.cfg')
<DistributionMetadata instance>

이는 순수한 Python(vanilla Python)이 서드파티 코드를 실행하지 않고도 패키지의 메타데이터를 읽을 수 있다는 것을 의미합니다.

이 기능은 metadata 네임스페이스에만 국한되지 않고, 다른 섹션도 이러한 컨텍스트 종속 섹션으로 확장될 수 있었습니다.

PKG-INFO 생성 및 PEP 314에 미치는 영향 (Impact on PKG-INFO generation and PEP 314)

Distutils가 PKG-INFO를 생성할 때, 조건에 의존하는 모든 필드는 ; 구분자 뒤에 해당 조건이 라인 끝에 기록됩니다.

예시:

Metadata-Version: 1.2
Name: distribute
Version: 0.6.4
...
Requires: pywin32, bar > 1.0; sys_platform == 'win32'
Requires: foo; os_machine == 'i386'
Requires: bar; python_version == '2.4' or python_version == '2.5'
Requires: baz; 'linux' in sys_platform
Obsoletes = pywin31; sys_platform == 'win32'
...
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Python Software Foundation License

이 파일은 DistributionMetadata 클래스로 열 수 있었습니다. 이 클래스는 실행 환경을 사용하여 마이크로 언어를 활용할 수 있습니다.

Python 2.5 i386 Linux에서 실행하는 예시:

>>> from distutils.dist import DistributionMetadata
>>> metadata = DistributionMetadata('PKG_INFO')
>>> metadata.get_requires()
['foo', 'bar', 'baz']

메타데이터를 다른 환경에 대해 얻으려는 경우 실행 환경을 재정의할 수 있었습니다:

>>> env = {'python_version': '2.4',
...        'os_name': 'nt',
...        'sys_platform': 'win32',
...        'platform_version': 'MVCC++ 6.0'
...        'platform_machine': 'i386'}
...
>>> metadata = DistributionMetadata('PKG_INFO', environment=env)
>>> metadata.get_requires()
['bar > 1.0', 'foo', 'bar']

PEP 314는 이에 따라 변경되어 각 필드가 추가 조건 마커를 가질 수 있도록 했습니다.

호환성 (Compatibility)

이 변경사항은 새로운 메타데이터 1.2 형식을 기반으로 하며, 이는 Distutils가 이전 PKG-INFO 파일과 새로운 파일을 구별할 수 있음을 의미합니다.

setup.cfg 파일 변경은 ConfigParser와 호환성을 유지하며 기존 setup.cfg 파일을 손상시키지 않을 것입니다.

한계 (Limitations)

이 제안은 <> 연산자를 제공하지 않았으며, python_version은 일반 문자열이었습니다. 이는 섹션을 특정 Python 버전으로 제한해야 할 때 or 연산자를 사용해야 함을 의미했습니다. 그러나 PEP 386이 수락되었다면, python_version은 내부적으로 문자열과 비교 가능하도록 변경될 수 있었고, <> 연산자가 도입될 수 있었습니다.

마지막으로, 배포판이 setup.cfg에 모든 메타데이터 필드를 설정할 수 없는 경우, local_metadata가 호출될 때 필드는 UNKNOWN으로 설정됩니다. UNKNOWN 값을 얻는 것은 전체 메타데이터를 얻기 위해 setup.py 명령줄 인터페이스를 실행해야 할 수도 있음을 의미했습니다.

⚠️ 알림: 이 문서는 AI를 활용하여 번역되었으며, 기술적 정확성을 보장하지 않습니다. 정확한 내용은 반드시 원문을 확인하시기 바랍니다.

Comments