packages オプションは、 packages リスト中で
指定されている各々のパッケージについて、パッケージ内に見つかった
全ての pure Python モジュールを処理 (ビルド、配布、インストール、等)
するよう Distutils に指示します。このオプションを指定するためには、
当然のことながら各パッケージ名はファイルシステム上のディレクトリ名と
何らかの対応付けができなければなりません。デフォルトで使われる
対応関係はきわめてはっきりしたものです。すなわち、パッケージ
distutils が配布物ルートディレクトリからの相対パス
distutils で表されるディレクトリ中にあるというものです。
つまり、setup スクリプト中で packages = ['foo']
と指定したら、
スクリプトの置かれたディレクトリからの相対パスで
foo/__init__.py を探し出せると Distutils に確約した
ことになります。この約束を裏切ると Distutils は警告を出しますが、
そのまま壊れたパッケージの処理を継続します。
ソースコードディレクトリの配置について違った規約を使っていても、 まったく問題はありません: 単に package_dir オプションを 指定して、 Distutils に自分の規約を教えればよいのです。 例えば、全ての Python ソースコードを lib 下に置いて、 ``ルートパッケージ'' 内のモジュール (つまり、どのパッケージ にも入っていないモジュール) を lib 内に入れ、 foo パッケージを lib/foo に入れる、といった 具合にしたいのなら、
package_dir = {'': 'lib'}
packages = ['foo']
を指定すれば、
lib/foo/__init__.py が存在すると Distutils に
確約したことになります。
もう一つの規約のあり方は foo パッケージを lib に 置き換え、foo.bar パッケージが lib/bar にある、 などとするものです。このような規約は、 setup スクリプトでは
package_dir = {'foo': 'lib'}
package: dir
のようなエントリがあると、
package の下にある全てのパッケージに対してこの規則が
暗黙のうちに適用され、その結果 foo.bar の場合が自動的に
処理されます。
この例では、 packages = ['foo', 'foo.bar']
は、
Distutils に lib/__init__.py と
lib/bar/__init__.py を探すように指示します。
(package_dir は再帰的に適用されますが、この場合
packages の下にある全てのパッケージを明示的に指定
しなければならないことを心に留めておいてください:
Distutils は __init__.py を持つディレクトリを
ソースツリーから再帰的にさがしたりは しません 。)
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。