# 7. Distutils 확장하기

참고

이 문서는 https://setuptools.readthedocs.io/en/latest/setuptools.html 의 `setuptools` 설명서가 현재 여기에 포함된 모든 관련 정보를 독립적으로 다루기 전까지만 보존됩니다.

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에는 경로 정보가 없고, 파일 자체의 이름만 들어 있습니다. 드라이 런 모드에서, 생성될 것을 나타내기 위해 쌍을 여전히 추가해야 합니다.