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에 의해 거부되었습니다.
PEP 426 (메타데이터 2.0)에 기반한 대체 PEP가 작성될 예정입니다. 이 PEP는 소스 tarball이나 VCS 체크아웃이 주어졌을 때 sdist 아카이브를 생성하는 데 필요한 최소한의 정보를 정의합니다.
근거
현재는 설치되지 않은 배포판의 모든 메타데이터(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 연산자(및 그 반대 연산자)로 비교하며, 표현식을 결합할 수 있습니다. 또한 이 덕분에 파이썬 사용자가 아닌 사람도 쉽게 이해할 수 있습니다.
의사 문법은 다음과 같습니다
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 파일과 새 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.