20

setuptools を使用する setup.py で Python パッケージをパッケージ化する場合:

from setuptools import setup
...

によって作成されたソース配布:

python setup.py sdist

通常どおり、MANIFEST.in で指定されたファイルを含めるだけでなく、Subversion がパッケージ ディレクトリの下でバージョン管理されているものとしてリストするすべてのファイルも無償で含めます。これは非常に迷惑です。パッケージと共に配布されるファイルを明示的に制御することが困難になるだけでなく、「svn チェックアウト」ではなく「svn エクスポート」に従ってパッケージをビルドすると、 .svn メタデータがない場合、setuptools は何を含めるかについて異なる選択を行うため、パッケージはまったく異なる可能性があります。

私の質問: Subversion を使用している場合でも、聞いたことのないバージョン管理を使用している場合でも、「svn export」で作成された裸のツリーを使用している場合でも、「setuptools」がプロジェクトを同じように扱うように、このひどい動作をオフにするにはどうすればよいですか?プロジェクトの最後に作成して、作業ディレクトリ以外の場所にきれいにビルドされるようにしましたか?

私がこれまでに管理した中で最高のものは、醜いモンキー パッチです。

from setuptools.command import sdist
del sdist.finders[:]

しかし、これはジャングルではなく Python であるため、もちろん、サルがまったく関与しない、より優れたソリューションが必要です。どうすれば setuptools を飼いならし、その魔法をオフにして、代わりに MANIFEST.py の目に見える予測可能なルールを見て、賢明に動作させることができますか?

4

6 に答える 6

14

ブランドン、あなたがこれについて多くを知っていることは知っていますが、他の人の利益のために(私はセットアップツールの専門家ではありませんが)できる限り完全な回答をしようと思います。

ここでの問題は、setuptools 自体が、プラグインを追加して含めるファイルを見つけることができる setuptools.file_finders というエントリ ポイントを使用するなど、非常に多くの黒魔術を必要とすることです。ただし、そこからプラグインを削除する方法については完全に途方に暮れています...

  • 簡単な回避策: svn でパッケージを一時ディレクトリにエクスポートし、そこから setup.py を実行します。つまり、svn がないため、svn ファインダーは含めるファイルを見つけられません。:)

  • より長い回避策: 本当に setuptools が必要ですか? Setuptools には多くの機能があるため、答えはおそらくイエスですが、主な機能は依存関係 (依存関係は easy_install によってインストールされます)、名前空間パッケージ (foo.bar)、およびエントリ ポイントです。名前空間パッケージは、setuptools がなくても実際に作成できます。しかし、これらのどれも使用しない場合は、実際には distutils を使用するだけで済む可能性があります。

  • 醜い回避策:質問でsdistに与えたmonkeypatchは、単にプラグインにファインダーがなく、すぐに終了します。

ご覧のとおり、この回答は、私が作成できる限り完全ではありますが、まだ恥ずかしいほど不完全です. 答えは「できません」だと思いますが、実際にはあなたの質問に答えることができません。

于 2009-07-15T10:27:16.323 に答える
9

以下を使用して MANIFEST.in ファイルを作成します。

recursive-exclude .
# other MANIFEST.in commands go here
# to explicitly include whatever files you want

MANIFEST.in 構文については、http://docs.python.org/distutils/commandref.html#sdist-cmdを参照してください。

于 2009-12-24T22:24:50.377 に答える
1

おそらく答えは setup.py にあります。find_packages を使用していますか? この関数は、デフォルトで VCS (subversion、hg など) を使用します。気に入らない場合は、必要なものだけを収集する別の Python 関数を作成してください。

于 2009-07-15T07:07:32.717 に答える
0

デフォルトの sdist の動作は正しいと思います。ソースディストリビューションをビルドする場合、 Subversion にチェックインされるすべてのものが含まれていることを期待します。もちろん、特別な状況できれいにオーバーライドできるとよいでしょう。

sdist を bdist_egg と比較します。明示的に指定されたファイルのみが含まれるに違いありません。

すべてsvnで、3つのファイルを使用して簡単なテストを行いました。dummy.lkj と foobar.py を空にし、setup.py を次のようにします。

import setuptools
setuptools.setup(name='foobar', version='0.1', py_modules=['foobar'])

sdist は、dummy.lkj を含む tarball を作成します。bdist_egg は、dummy.lkj を含まない卵を作成します。

于 2009-07-15T17:53:08.310 に答える
-1

おそらく次のようなものが必要です。

from distutils.core import setup

def packages():
    import os

    packages = []

    for path, dirs, files in os.walk("yourprogram"):
        if ".svn" in dirs:
            dirs.remove(".svn")

        if "__init__.py" in files:
            packages.append(path.replace(os.sep, "."))

    return packages

setup(
    # name, version, description, etc...

    packages = packages(),

    # pacakge_data, data_files, etc...
)
于 2009-07-15T07:15:15.307 に答える