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 파일          | (2)           |
|             | (".tar.gz")               |               |
+-------------+---------------------------+---------------+
| "bztar"     | bzip2 된 tar 파일         | (5)           |
|             | (".tar.bz2")              |               |
+-------------+---------------------------+---------------+
| "xztar"     | xz 된 tar 파일            | (5)           |
|             | (".tar.xz")               |               |
+-------------+---------------------------+---------------+
| "ztar"      | compress 된 tar 파일      | (4),(5)       |
|             | (".tar.Z")                |               |
+-------------+---------------------------+---------------+
| "tar"       | tar 파일 (".tar")         | (5)           |
+-------------+---------------------------+---------------+

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

노트:

1. 윈도우의 기본값

2. 유닉스의 기본값

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

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

5. deprecated by PEP 527; PyPI only accepts ".zip" and ".tar.gz"
   files.

모든 "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"의 줄임 표현입니다.
