# 4. 소스 배포판 만들기

참고

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

간단한 예 섹션에 표시된 것처럼, sdist 명령을 사용하여 소스 배포를 만듭니다. 가장 간단한 경우,

    python setup.py sdist

(설정 스크립트나 구성 파일에 sdist 옵션을 지정하지 않았다고 가정할 때) sdist는 현재 플랫폼의 기본 형식의 아카이브를 만듭니다. 기본 형식은 유닉스에서는 gzip 된 tar 파일(`.tar.gz`)이고, 윈도우에서는 ZIP 파일입니다.

`--formats` 옵션을 사용하여 원하는 만큼 형식을 지정할 수 있습니다. 예를 들면:

    python setup.py sdist --formats=gztar,zip

은 gzip 된 tar 파일과 zip 파일을 만듭니다. 사용 가능한 형식은 다음과 같습니다:

형식 | 설명 | 노트
--- | --- | ---
`zip` | zip 파일 (`.zip`) | (1),(3)
`gztar` | gzip 된 tar 파일 (`.tar.gz`) | (2)
`bztar` | bzip2 된 tar 파일 (`.tar.bz2`) |
`xztar` | xz 된 tar 파일 (`.tar.xz`) |
`ztar` | compress 된 tar 파일 (`.tar.Z`) | (4)
`tar` | tar 파일 (`.tar`) |

버전 3.5에서 변경: `xztar` 형식에 대한 지원이 추가되었습니다.

노트:

1. 윈도우의 기본값

2. 유닉스의 기본값

3. 외부 zip 유틸리티나 `zipfile` 모듈(파이썬 1.6 이후 표준 파이썬 라이브러리의 일부)이 필요합니다

4. compress 프로그램이 필요합니다. 이 형식은 현재 폐지될 예정이며 이후 버전의 파이썬에서는 제거될 예정입니다.

모든 `tar` 형식(`gztar`, `bztar`, `xztar`, `ztar` 또는 `tar`)을 사용할 때, 유닉스에서 각 아카이브 멤버에 대해 설정될 `owner`와 `group` 이름을 지정할 수 있습니다.

예를 들어, 아카이브의 모든 파일을 root가 소유하도록 하고 싶으면:

    python setup.py sdist --owner=root --group=root

## 4.1. 배포할 파일 지정하기

명시적인 파일 목록(또는 생성하는 방법에 대한 지침)을 제공하지 않으면, sdist 명령은 최소 기본 집합을 소스 배포에 넣습니다:

- `py_modules`와 `packages` 옵션에 의해 암시된 모든 파이썬 소스 파일

- `ext_modules`나 `libraries` 옵션에 언급된 모든 C 소스 파일

- `scripts` 옵션으로 식별된 스크립트. 스크립트 설치하기를 참조하십시오.

- 테스트 스크립트처럼 보이는 것: `test/test*.py` (현재, Distutils는 소스 배포에 포함하는 것을 제외하고 테스트 스크립트로 아무것도 하지 않지만, 향후에는 파이썬 모듈 배포를 테스트하기 위한 표준이 있을 것입니다)

- 표준 README 파일 (`README`, `README.txt` 또는 `README.rst`), `setup.py` (또는 여러분이 설정 스크립트라고 부르는 것) 및 `setup.cfg`.

- `package_data` 메타 데이터와 일치하는 모든 파일. 패키지 데이터 설치하기를 참조하십시오.

- `data_files` 메타 데이터와 일치하는 모든 파일. 추가 파일 설치하기를 참조하십시오.

때로는 이것으로 충분하지만, 일반적으로 배포할 추가 파일을 지정하려고 합니다. 이를 수행하는 일반적인 방법은 기본적으로 `MANIFEST.in`이라는 매니페스트 템플릿(manifest template)을 작성하는 것입니다. 매니페스트 템플릿은 소스 배포에 포함할 정확한 파일 목록인 매니페스트 파일 `MANIFEST`를 생성하는 방법에 대한 지침 목록일 뿐입니다. sdist 명령은 이 템플릿을 처리하고 해당 지침과 파일 시스템에서 찾은 내용을 기반으로 매니페스트를 생성합니다.

여러분 자신의 매니페스트 파일을 만드는 것을 선호한다면 형식은 간단합니다: 한 줄에 파일 이름 하나, 일반 파일 (또는 이들에 대한 심볼릭 링크)만 가능합니다. 여러분 자신의 `MANIFEST`를 제공하면, 모든 것을 지정해야 합니다: 위에서 설명한 기본 파일 집합은 이 경우 적용되지 않습니다.

버전 3.1에서 변경: 기존 생성된 `MANIFEST`는 sdist가 수정 시간을 `MANIFEST.in`이나 `setup.py`와 비교하지 않고 재생성됩니다.

버전 3.1.3에서 변경: `MANIFEST` 파일은 생성되었음을 나타내는 주석으로 시작합니다. 이 주석이 없는 파일은 덮어쓰거나 제거되지 않습니다.

버전 3.2.2에서 변경: 예전처럼, `MANIFEST.in`이 존재하지 않으면 sdist는 `MANIFEST` 파일을 읽습니다.

버전 3.7에서 변경: `README.rst`는 이제 distutils 표준 README 목록에 포함됩니다.

매니페스트 템플릿에는 한 줄에 하나의 명령이 있으며, 각 명령은 소스 배포에서 포함하거나 제외할 파일 집합을 지정합니다. 예를 들기 위해, 다시 Distutils의 매니페스트 템플릿으로 전환합니다:

    include *.txt
    recursive-include examples *.txt *.py
    prune examples/sample?/build

의미는 꽤 명확해야 합니다: `*.txt`와 일치하는 배포 루트의 모든 파일, `*.txt`나 `*.py`와 일치하는 `examples` 디렉터리 아래의 모든 파일을 포함하고, `examples/sample?/build`와 일치하는 모든 디렉터리를 제외합니다. 이 모든 것은 표준 포함 집합 후에 수행되므로, 매니페스트 템플릿의 명시적 지침을 사용하여 표준 집합에서 파일을 제외할 수 있습니다. (또는 `--no-defaults` 옵션을 사용하여 표준 집합을 완전히 비활성화 할 수 있습니다.) 매니페스트 템플릿 미니 언어에서 사용할 수 있는 다른 명령이 몇 가지 있습니다; 섹션 소스 배포 만들기: sdist 명령을 참조하십시오.

매니페스트 템플릿의 명령 순서는 중요합니다: 처음에는, 위에서 설명한 기본 파일 목록이 있으며 템플릿의 각 명령은 해당 파일 목록에 대해 추가하거나 제거합니다. 일단 매니페스트 템플릿을 완전히 처리하면, 소스 배포에 포함되지 않아야 하는 파일을 제거합니다:

- Distutils “빌드” 트리(기본값은 `build/`)의 모든 파일

- `RCS`, `CVS`, `.svn`, `.hg`, `.git`, `.bzr` 또는 `_darcs`라는 디렉터리의 모든 파일

이제 전체 파일 목록이 준비되어서, 이 파일은 나중에 참조할 수 있도록 매니페스트에 기록되고, 소스 배포 아카이브를 빌드하는 데 사용됩니다.

`--no-defaults` 옵션으로 기본 포함 파일 집합을 비활성화 할 수 있으며, `--no-prune`으로 표준 제외 집합을 비활성화 할 수 있습니다.

Distutils의 자체 매니페스트 템플릿에 따라, sdist 명령이 Distutils 소스 배포에 포함할 파일 목록을 빌드하는 방법을 추적해 보겠습니다:

1. `distutils`와 `distutils/command` 서브 디렉터리에 있는 모든 파이썬 소스 파일을 포함합니다 (두 디렉터리에 해당하는 패키지가 설정 스크립트의 `packages` 옵션에 언급되었기 때문입니다—섹션 설정 스크립트 작성하기를 참조하십시오)

2. `README.txt`, `setup.py` 및 `setup.cfg`를 포함합니다 (표준 파일)

3. `test/test*.py`를 포함합니다 (표준 파일)

4. 배포 루트에 있는 `*.txt`를 포함합니다 (이것은 `README.txt`를 두 번 찾을 수 있지만, 나중에 이러한 중복은 제거됩니다)

5. `examples` 아래의 서브 트리에 있는 `*.txt`나 `*.py`와 일치하는 모든 것을 포함합니다.

6. `examples/sample?/build`와 일치하는 디렉터리에서 시작하는 서브 트리에 있는 모든 파일을 제외합니다—이것은 이전 두 단계에서 포함된 파일을 제외할 수 있어서, 매니페스트 템플릿의 `prune` 명령이 `recursive-include` 명령 뒤에 오는 것이 중요합니다

7. 전체 `build` 트리와 `RCS`, `CVS`, `.svn`, `.hg`, `.git`, `.bzr` 및 `_darcs` 디렉터리를 제외합니다

설정 스크립트와 마찬가지로, 매니페스트 템플릿의 파일과 디렉터리 이름은 항상 슬래시로 구분해야 합니다; Distutils는 이를 플랫폼의 표준 표현으로 변환합니다. 이런 방식으로, 매니페스트 템플릿은 운영 체제에 걸쳐 이식성이 있습니다.

## 4.2. 매니페스트 관련 옵션

sdist 명령의 일반적인 작동 과정은 다음과 같습니다:

- 매니페스트 파일(기본적으로 `MANIFEST`)이 존재하고 첫 번째 줄에 `MANIFEST.in`에서 생성되었음을 나타내는 주석이 없으면 그대로 사용됩니다.

- 매니페스트 파일이 없거나 이전에 자동으로 생성되었으면, `MANIFEST.in`을 읽고 매니페스트를 만듭니다

- `MANIFEST`도 `MANIFEST.in`도 없으면, 기본 파일 집합만으로 매니페스트를 만듭니다

- 이제 (방금 생성되었거나 읽어 들인) `MANIFEST`의 파일 목록을 사용하여 소스 배포 아카이브를 만듭니다

이 동작을 수정하는 몇 가지 옵션이 있습니다. 먼저 `--no-defaults`와 `--no-prune`을 사용하여 표준 “include”와 “exclude” 집합을 비활성화합니다.

둘째, 소스 배포를 만들지 않고, 매니페스트만 (재) 생성하고 싶을 수 있습니다:

    python setup.py sdist --manifest-only

`-o`는 `--manifest-only`의 줄임 표현입니다.