# 4. ソースコード配布物を作成する

簡単な例 節で示したように、ソースコード配布物を作成するには sdist コマンドを使います。最も単純な例では、

    python setup.py sdist

のようにします (ここでは、 sdist に関するオプションを setup スクリプトや設定ファイル中で行っていないものと仮定します)。 sdist は、現在のプラットフォームでのデフォルトのアーカイブ形式でアーカイブを生成します。デフォルトの形式は Unixでは gzip で圧縮された tar ファイル形式 (`.tar.gz`) で、Windows では ZIP 形式です。

`--formats` オプションを使えば、好きな数だけ圧縮形式を指定できます。例えば:

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

は、gzip された tarball と 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. Windows でのデフォルト形式です

2. Unixでのデフォルト形式です

3. 外部ユーティリティの zip か、 `zipfile` モジュール (Python 1.6 からは標準 Python ライブラリの一部になっています) が必要です

4. compress プログラムが必要です。このフォーマットは廃止が検討されていて、将来のバージョンの Python では削除されるであろうことに注意してください。

`tar` フォーマットのどれか (`gztar`, `bztar`, `xztar`, `ztar`, `tar`) を利用する時、 Unix ではアーカイブ内の各メンバに設定される `owner` と `group` 名を指定することができます。

例えば、アーカイブ内の全てのファイルの所有者を root にするには、次のようにします。

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

## 4.1. 配布するファイルを指定する

明確なファイルのリスト (またはファイルリストを生成する方法) を明示的に与えなかった場合、 sdist コマンドはソース配布物に以下のような最小のデフォルトのセットを含めます:

- `py_modules` と `packages` オプションに指定された Python ソースファイル全て

- `ext_modules` オプションと `libraries` オプションで挙げられている C ソースファイル全て

- `scripts` オプションで指定されたスクリプト。 スクリプトをインストールする を参照してください。

- テストスクリプトと思しきファイル全て: `test/test*.py` (現状では、Distutils はテストスクリプトをただソース配布物に含めるだけですが、将来は Python モジュール配布物に対するテスト標準ができるかもしれません)

- `README.txt` (または `README`)、 `setup.py` (または setup スクリプトにしているもの) 、および `setup.cfg`

- `package_data` メタデータにマッチする全てのファイル。 パッケージデータをインストールする を参照してください。

- `data_files` メタデータにマッチする全てのファイル。 追加のファイルをインストールする を参照してください。

上記のセットで十分なこともありますが、大抵他のファイルを配布物に含めたいと思うでしょう。普通は、 `MANIFEST.in` と呼ばれる マニフェストテンプレート (manifest template) を使ってこれを行います。マニフェストテンプレートは、ソース配布物に含めるファイルの正確なリストであるマニフェストファイル `MANIFEST` をどうやって作成するか指示しているリストです。 sdist コマンドはこのテンプレートを処理し、書かれた指示とファイルシステム上に見つかったファイルに基づいてマニフェストファイルを作成します。

自分用のマニフェストファイルを書きたいなら、その形式は簡単です: 一行あたり一つの通常ファイル (または通常ファイルに対するシンボリックリンク) だけを書きます。自分で `MANIFEST` を提供する場合、全てを自分で指定しなければなりません: ただし、上で説明したデフォルトのファイルセットは、この中には含まれません。

バージョン 3.1 で変更: sdist は `MANIFEST.in` もしくは `setup.py` と更新時刻を比較せずに、生成されて既に存在している `MANIFEST` を再生成します。

バージョン 3.1.3 で変更: `MANIFEST` ファイルの先頭に、生成されたものであることを示すコメントが付きます。このコメントが無いファイルは上書きや削除はされません。

バージョン 3.2.2 で変更: 以前そうであったように、 `MANIFEST.in` が無い場合、 sdist は `MANIFEST` を読みに行きます。

マニフェストテンプレートには 1 行ごとに 1 つのコマンドがあり、それぞれのコマンドはソース配布物に含む、もしくは含まないファイルの集合を指定します。例として、再度 Distutils 自身のマニフェストテンプレートに戻りましょう:

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

その意味はかなり明白です: 配布物ルートの `*.txt` のパターンに当て嵌まる全てのファイルと、 `examples` ディレクトリ以下の `*.txt` または `*.py` のパターンに当て嵌まる全てのファイルを含み、 `examples/sample?/build` のパターンに当て嵌まる全てのディレクトリを除外します。これらの処理は、標準で含むファイル一式が定まった 後に 行われ、マニフェストテンプレートに明示的に指示を書くことで、標準のファイル一式からファイルを除外することができます。 (もしくは、 `--no-defaults` オプションを使って、標準のファイル一式の定義を全て無効にすることもできます。) マニフェストテンプレートの小言語では、他にもいくつかのコマンドが利用できます; ソース配布物を生成する: sdist コマンド を参照してください。

マニフェストテンプレート中のコマンドの順番には意味があります; 初期状態では、上で述べたようなデフォルトのファイルがあり、テンプレート中の各コマンドによって、逐次ファイルを追加したり除去したりしていいます。マニフェストテンプレートを完全に処理し終えたら、ソース配布物中に含めるべきでない以下のファイルをリストから除去します:

- Distutls の "build" (デフォルトの名前は `build/`) ツリー下にある全てのファイル

- `RCS`, `CVS`, `.svn`, `.hg`, `.git`, `.bzr`, `_darcs` といった名前のディレクトリ下にある全てのファイル

こうして完全なファイルのリストができ、後で参照するためにマニフェストに書き込まれます。この内容は、ソース配布物のアーカイブを作成する際に使われます。

含めるファイルのデフォルトセットは `--no-defaults` で無効化でき、標準で除外するセットは `--no-prune` で無効化できます。

Distutils 自体のマニフェストテンプレートから、 sdist コマンドがどのようにして Distutils ソース配布物に含めるファイルのリストを作成するか見てみましょう:

1. `distutils` ディレクトリ、および `distutils/command` サブディレクトリの下にある全ての Python ソースファイルを含めます (これらの二つのディレクトリが、setup スクリプト下の `packages` オプションに記載されているからです --- setup スクリプトを書く を参照してください)

2. `README.txt`, `setup.py`, および `setup.cfg` (標準のファイルセット) を含めます

3. `test/test*.py` (標準のファイルセット) を含めます

4. 配布物ルート下の `*.txt` を含めます (この処理で、 `README.txt` がもう一度見つかりますが、こうした冗長性は後で刈り取られます)

5. `examples` 下にあるサブツリー内で `*.txt` または `*.py` にマッチする全てのファイルを含めます

6. ディレクトリ名が `examples/sample?/build` にマッチするディレクトリ以下のサブツリー内にあるファイル全てを除外します--- この操作によって、上の二つのステップでリストに含められたファイルが除外されることがあるので、マニフェストテンプレート内では `recursive-include` コマンドの後に `prune` コマンドを持ってくることが重要です

7. `build` ツリー全体、および `RCS`, `CVS`, `.svn`, `.hg`, `.git`, `.bzr`, `_darcs` ディレクトリ全てを除外します。

setup スクリプトと同様、マニフェストテンプレート中のディレクトリ名は常にスラッシュ区切りで表記します; Distutils は、こうしたディレクトリ名を注意深くプラットフォームでの標準的な表現に変換します。このため、マニフェストテンプレートは複数のオペレーティングシステムにわたって可搬性を持ちます。

## 4.2. マニフェスト (manifest) 関連のオプション

sdist コマンドが通常行う処理の流れは、以下のようになっています:

- マニフェストファイル (デフォルトでは `MANIFEST`) が存在し、1行目に `MANIFEST.in` から生成されたことを示すコメントが無い場合は、変更を加えずにそのまま使用します

- マニフェストファイルが存在しないか、前回自動生成されていた場合は、 `MANIFEST.in` を読み込み、マニフェストを作成します

- `MANIFEST` も `MANIFEST.in` もなければ、デフォルトのファイルセットだけでできたマニフェストファイルを作成します

- (生成されたか、読み出された) `MANIFEST` 内にあるファイルのリストを使ってソース配布物アーカイブを作成します

上の動作は二種類のオプションを使って変更できます。まず、標準の "include" および "exclude" セットを無効化するには `--no-defaults` および `--no-prune` を使います。

第2に、単にマニフェストを (再)生成したいだけで、ソース配布物は作成したくない場合があるかもしれません:

    python setup.py sdist --manifest-only

`-o` は `--manifest-only` のショートカットです。