2009-07-15 17 views
20

setuptoolsのを使用していますsetup.pyでPythonパッケージをパッケージ作成者:setuptoolsにサブバージョンインベントリを無視させる方法を教えてください。

from setuptools import setup 
... 

ソース配布:

python setup.py sdist 

だけでなく、含まれては、いつものように、ファイルがマニフェストに指定されています。 Subversionがパッケージディレクトリの下でバージョン管理されているものとしてリストされているすべてのファイルも含まれています。これは非常に迷惑です。私のパッケージでどのファイルが配布されるかを明示的に制御するのは難しいだけでなく、 "svn checkout"の代わりに "svn export"の後にパッケージをビルドすると、私の.svnメタデータがなければ、setuptoolsは何を含めるべきかについて異なる選択をするので、パッケージはかなり異なるかもしれません。

私の質問: "setuptools"が私のプロジェクトをSubversionやそれが聞こえなかったバージョンコントロールを使用しているのと同じ方法で扱うように、どうやってこのひどい振る舞いを止めることができますか、 "svnプロジェクトの最後に作成した「エクスポート」を使用して、作業ディレクトリ以外の場所にきれいに構築されていることを確認します。

私がこれまで管理してきた最高の

は醜い猿パッチです:

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

しかし、もちろん、私はまったくサルが含まれていないよりよい解決策をしたいので、これは、Pythonのではなく、ジャングルです。どのように私はsetuptoolsを飼いならし、その魔法を消し、MANIFEST.pyの目に見える、予測可能なルールを見て賢明に振る舞うことができますか?

+0

私はまったく同じ問題を、ここでは.gitとpy2appでしかないと思います。http://stackoverflow.com/questions/9845590/py2app-picking-up-git-subdir-of-a-package-during -build – jdi

+0

うわー、それは同じ問題のように見えます! –

+0

私自身の質問に対する答えとして、モンキーパイのハックを投稿しました。 Haventはもっと良い発見をしたが、 – jdi

答えて

15

を)他の人の利益のために。

ここで問題となるのは、setuptools自体には、setuptools.file_findersというエントリポイントを使用するなど、非常に多くのブラックマジックが含まれています。ここには、プラグインを追加してインクルードするファイルを見つけることができます。私は...どのようにそれからプラグインを除去するために完全な損失で、しかし、

  • 午前クイック回避策:SVN一時ディレクトリにあなたのパッケージをエクスポートし、そこからsetup.pyを実行します。つまり、あなたはsvnを持っていないので、svn finderはインクルードするファイルが見つからないことを意味します。 :)

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

  • 醜い回避策:あなたの質問でsdistに与えたmonkeypatchは、単にプラグインにファインダを持たせず、すぐに終了します。

あなたが見るように、この回答は、私が作ることができるほど完全ですが、まだ恥ずかしいほど不完全です。答えは "あなたができない"と思っていますが、あなたの質問に実際には答えられません。

1

答えはあなたのsetup.pyにあります。 find_packagesを使用していますか?この関数は、デフォルトでVCSを使用します(例えば、subversion、hg、...)。それが気に入らなければ、必要なものだけを集める別のPython関数を書いてください。

+0

find_packagesそれ自体は実際にはlistdirを使って '__init __。py'という名前のファイルを探します。 –

-1

あなたは、おそらくこのような何かしたい:私はsetuptoolsののguryよませんが(私はあなたがブランドン、これの多くを知っている知っているが、私は私ができるよう完全な答えとして与えるためにしようとするでしょう

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... 
) 
+1

+1:downvoteについては、投稿が無効である理由を説明してください。このアプローチは素晴らしいと思われます。 –

0

私は、デフォルトのsdistの動作が正しいと主張します。あなたはソースディストリビューションを構築しているとき、私はそれはSubversionのにチェックされているすべてが含まれていることを期待します。もちろん、それを特別な状況できちんと上書きできるのは良いことです。

bdist_eggとsdistを比較します。私は明示的に指定されたファイルだけが含まれると確信しています。

私は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を含まない卵を作成します。

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を参照してください。

+0

それは私のためにエラーを生成します。私は 'recursive-exclude 'を使わなければならなかった。 * '。 –