7. Distutils 확장하기
*********************

Distutils는 다양한 방법으로 확장할 수 있습니다. 대부분 확장은 새로운
명령이나 기존 명령의 대체 형식을 취합니다. 예를 들어, 새로운 유형의 플
랫폼 특정 패키징을 지원하기 위해 새로운 명령을 작성할 수 있습니다. 반
면, 기존 명령을 대체하여 명령이 패키지에서 작동하는 방식의 세부 사항을
수정할 수 있습니다.

distutils의 대부분 확장은 기존 명령을 수정하고자 하는 "setup.py" 스크
립트 내에서 이루어집니다; 많은 사람은 편의상 ".py" 파일 외에 패키지에
복사해야 하는 몇 가지 파일 확장자를 추가합니다.

대부분 distutils 명령 구현은 "distutils.cmd.Command" 클래스의 서브 클
래스입니다. 새 명령은 "Command"를 직접 상속할 수 있지만, 대체 명령은
종종 대체할 명령을 직접 서브클래싱해서, 간접적으로 "Command"를 상속합
니다. 명령은 "Command"에서 파생되어야 합니다.


7.1. 새 명령 통합하기
=====================

새로운 명령 구현을 distutils에 통합하는 여러 방법이 있습니다. 가장 어
려운 것은 distutils 자체에 새로운 기능을 넣기 위해 로비를 하고, 그 지
원을 제공하는 파이썬 버전을 기다리는 (그리고 요구하는) 것입니다. 이것
은 여러 가지 이유로 정말 어렵습니다.

가장 흔한, 그리고 아마도 대부분 필요에 가장 합리적인 것은, "setup.py"
스크립트에 새 구현을 넣고 "distutils.core.setup()" 함수에서 이를 사용
하도록 하는 것입니다.:

   from distutils.command.build_py import build_py as _build_py
   from distutils.core import setup

   class build_py(_build_py):
       """Specialized Python source builder."""

       # implement whatever needs to be different...

   setup(cmdclass={'build_py': build_py},
         ...)

이 방법은 특정 패키지를 사용하기 위해 새로운 구현을 사용해야 할 때 가
장 유용합니다. 패키지에 관심이 있는 모든 사람이 새로운 명령 구현을 가
질 필요가 있기 때문입니다.

파이썬 2.4부터는, 세 번째 옵션을 사용할 수 있습니다. 파이썬 설치를 수
정하지 않고도 기존 "setup.py" 스크립트를 지원할 수 있는 새로운 명령을
추가 할 수 있습니다. 이것은 제삼자 확장이 추가 패키징 시스템에 대한 지
원을 제공토록 할 것으로 기대되지만, 명령은 distutils 명령을 사용할 수
있는 모든 것에 사용할 수 있습니다. 새로운 구성 옵션,
"command_packages" (명령 줄 옵션 "--command-packages"), 을 사용하여 명
령을 구현하는 모듈을 검색할 추가 패키지를 지정할 수 있습니다. 모든
distutils 옵션과 마찬가지로, 이것은 명령 줄이나 구성 파일에서 지정할
수 있습니다. 이 옵션은 구성 파일의 "[global]" 섹션이나, 명령 줄의 모든
명령 앞에서만 설정할 수 있습니다. 구성 파일에 설정하면, 명령 줄에서 재
정의할 수 있습니다; 명령 줄에서 빈 문자열로 설정하면 기본값이 사용됩니
다. 이것은 패키지와 함께 제공된 구성 파일에서 절대로 설정해서는 안 됩
니다.

이 새로운 옵션은 명령 구현을 위해 검색되는 패키지 리스트에 원하는 만큼
패키지를 추가하는 데 사용할 수 있습니다; 여러 패키지 이름은 쉼표로 구
분해야 합니다. 지정하지 않으면, 검색은 "distutils.command" 패키지에서
만 수행됩니다. 그러나, "setup.py"가 옵션 "--command-packages
distcmds,buildcmds"로 실행되면, 패키지 "distutils.command", "distcmds"
및 "buildcmds"가 이 순서로 검색됩니다. 새 명령은 같은 이름의 모듈에,
같은 이름을 공유하는 클래스에 의해 구현될 것으로 기대됩니다. 위의 예제
명령 줄 옵션에서, **bdist_openpkg** 명령은
"distcmds.bdist_openpkg.bdist_openpkg"나
"buildcmds.bdist_openpkg.bdist_openpkg" 클래스로 구현될 수 있습니다.


7.2. 새 배포 유형 추가하기
==========================

배포본("dist/" 디렉터리의 파일)을 만드는 명령은 "(command, filename)"
쌍을 "self.distribution.dist_files"에 추가하여 **upload**가 PyPI에 올
릴 수 있도록 해야 합니다. 쌍의 *filename*에는 경로 정보가 없고, 파일
자체의 이름만 들어 있습니다. 드라이 런 모드에서, 생성될 것을 나타내기
위해 쌍을 여전히 추가해야 합니다.
