PEP 390 – Distutils의 정적 메타데이터
- Author:
- Tarek Ziadé <tarek at ziade.org>
- BDFL-Delegate:
- Alyssa Coghlan
- Discussions-To:
- Distutils-SIG list
- Status:
- Rejected
- Type:
- Standards Track
- Topic:
- Packaging
- Created:
- 10-Oct-2009
- Python-Version:
- 2.7, 3.2
- Post-History:
- Resolution:
- Distutils-SIG message
Table of Contents
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP는 setup.cfg 파일에 대한 새로운 섹션과 새로운 형식을 설명하며, setup.py를 사용하지 않고 패키지의 메타데이터를 설명할 수 있도록 합니다.
거부 공지
distutils2가 더 이상 표준 라이브러리에 통합되지 않을 예정이므로, 이 PEP는 2013년 4월 말 Alyssa Coghlan에 의해 거부되었습니다.
소스 tarball 또는 VCS 체크아웃이 주어졌을 때 sdist 아카이브를 생성하는 데 필요한 최소한의 정보량을 정의하는, PEP 426(메타데이터 2.0)에 기반한 대체 PEP가 작성될 예정입니다.
근거
오늘날 설치되지 않은 배포판의 모든 메타데이터를 나열하려면(PEP 314 참조), setup.py 명령줄 인터페이스를 사용해야 합니다.
따라서 기본적으로 이를 다운로드한 다음 실행합니다.:
$ python setup.py --name
Distribute
$ python setup.py --version
0.6.4
여기서 name과 version은 메타데이터 필드입니다. 이는 정상적으로 작동하지만 개발자가 setup.py에 코드를 더 추가하는 순간 이 기능이 중단될 수 있으며, 최악의 경우 대상 시스템에서 원치 않는 작업을 수행할 수도 있습니다.
또한 OS 패키저가 다시 패키징하는 배포판의 메타데이터를 가져오려고 할 때, 작업 중인 setup.py 파일을 이해하는 데 몇 가지 문제를 겪을 수 있습니다.
따라서 이 PEP의 근거는 실행할 서드 파티 코드가 필요 없는 setup.py와 함께 정적 구성 파일에 메타데이터를 선언하는 방법을 제공하는 것입니다.
setup.cfg에 metadata 섹션 추가
도입하려는 첫 번째 사항은 setup.cfg 파일에 있는 [metadata] 섹션으로, 메타데이터의 어떤 필드든 포함할 수 있습니다.:
[metadata]
name = Distribute
version = 0.6.4
setup.cfg 파일은 Distutils에서 작업할 구성 파일을 또 하나 추가하지 않기 위해 사용됩니다.
이 파일은 명령이 실행될 때 Distutils가 이미 읽으며, metadata 섹션이 발견되면 메타데이터 필드를 채우는 데 사용됩니다. 메타데이터 필드에 해당하는 옵션을 setup()에 지정하면, setup.cfg에 있을 수 있었던 값을 덮어씁니다.
setup.py는 여전히 사용되며 메타데이터 필드에 속하지 않는 일부 옵션을 정의하는 데 필요할 수 있다는 점에 유의하십시오. 예를 들어 sdist 명령은 packages 또는 scripts와 같은 옵션을 사용할 수 있습니다.
여러 줄 값
일부 메타데이터 필드는 여러 값을 가질 수 있습니다. setup.cfg를 ConfigParser 및 RFC 822의 LONG HEADER FIELDS(섹션 3.1.1 참조)와 호환되도록 유지하기 위해, 이러한 값은 ,로 구분된 값으로 표현됩니다.:
requires = pywin32, bar > 1.0, foo
이 변수를 읽으면 값이 구문 분석되어 다음과 같은 리스트로 변환됩니다: ['pywin32', 'bar > 1.0', 'foo'].
컨텍스트 의존 섹션
metadata 섹션에서도 컨텍스트 의존 섹션을 사용할 수 있게 됩니다.
컨텍스트 의존 섹션은 실행 환경에 대한 조건이 있는 섹션입니다. 다음은 몇 가지 예입니다.:
[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 참조)
이 이면의 마이크로 언어는 가능한 한 단순합니다. 문자열만 비교하며, == 및 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이 서드파티 코드를 실행하지 않고도 패키지의 메타데이터를 읽을 수 있음을 의미합니다.
이 기능은 metadata 네임스페이스에 국한되지 않는다는 점에 유의하십시오. 따라서 다른 어떤 섹션이든 이러한 문맥 의존적 섹션으로 확장될 수 있습니다.
PKG-INFO 생성 및 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가 변경되어, 각 필드가 이 추가 조건 마커를 가질 수 있게 됩니다.
호환성
이 변경은 새로운 메타데이터 1.2 형식을 기반으로 하며, 이를 통해 Distutils가 기존 PKG-INFO 파일과 새 파일을 구별할 수 있게 됩니다.
setup.cfg 파일 변경은 ConfigParser와 호환성을 유지하며 기존 setup.cfg 파일을 손상시키지 않습니다.
제한 사항
현재는 <와 > 연산자를 제공하지 않으며, python_version은 일반 문자열입니다. 이는 섹션을 두어 개의 Python 버전으로 제한해야 할 때 or 연산자를 사용해야 함을 의미합니다. 다만 PEP 386이 채택되면, python_version이 내부적으로 문자열과 비교 가능한 무언가로 변경되고 <와 > 연산자가 도입될 수 있습니다.
마지막으로, 배포판이 setup.cfg에서 모든 메타데이터 필드를 설정할 수 없다면 괜찮습니다. local_metadata가 호출될 때 해당 필드는 UNKNOWN으로 설정됩니다. UNKNOWN 값을 얻는다는 것은 전체 메타데이터를 얻기 위해 setup.py 명령줄 인터페이스를 실행해야 할 수도 있음을 의미합니다.
감사의 말
Distutils-SIG.
Copyright
This document has been placed in the public domain.