如何让setuptools忽略subversion库存?

Bra*_*des 20 python packaging egg setuptools

使用使用setuptools的setup.py打包Python包时:

from setuptools import setup
...
Run Code Online (Sandbox Code Playgroud)

源分发创建者:

python setup.py sdist
Run Code Online (Sandbox Code Playgroud)

像往常一样,不仅包括MANIFEST.in中指定的文件,而且它也包括Subversion在包目录下列出的所有文件控制版本.这非常烦人.它不仅难以对我的包中分发的文件进行任何形式的显式控制,而且意味着当我按照"svn export"而不是"svn checkout"构建我的包时,我的内容包可能会有很大的不同,因为没有.svn元数据setuptools会对要包含的内容做出不同的选择.

我的问题:如何关闭这种可怕的行为,以便"setuptools"以同样的方式处理我的项目,无论我使用的是Subversion,还是从未听说过的版本控制,或者是使用"svn export"创建的裸树在我的项目结束时创建,以确保它在我的工作目录之外的某个地方干净地构建?

到目前为止我管理的最好的是一个丑陋的猴子补丁:

from setuptools.command import sdist
del sdist.finders[:]
Run Code Online (Sandbox Code Playgroud)

但这是Python,而不是丛林,所以当然我想要一个更好的解决方案,根本不涉及猴子.我如何通过查看MANIFEST.py中可见的,可预测的规则来驯服setuptools,关闭它的魔力并让它表现得明智?

Len*_*bro 14

我知道你对此非常了解,布兰登,但我会尽力给出一个完整的答案(虽然我不是设置工具),以造福他人.

这里的问题是setuptools本身涉及很多黑魔法,包括使用一个名为setuptools.file_finders的入口点,你可以在其中添加插件来查找要包含的文件.然而,我完全失去了如何从中插入REMOVE ...

  • 快速解决方法:svn将包导出到临时目录并从那里运行setup.py.这意味着你没有svn,所以svn finder找不到要包含的文件.:)

  • 更长的解决方法:你真的需要setuptools吗?Setuptools有很多功能,所以答案可能是肯定的,但主要是那些功能是depdenencies(因此你的依赖项由easy_install安装),命名空间包(foo.bar)和入口点.实际上也可以在没有setuptools的情况下创建命名空间包.但是,如果你不使用这些,你实际上可能只是使用distutils.

  • 丑陋的解决方法:你在问题中给sdist提供的monkeypatch,它简单地使插件没有任何查找器,并快速退出.

所以你看,这个答案虽然尽我所能,但仍然是令人尴尬的不完整.我实际上无法回答你的问题,但我认为答案是"你做不到".


PJ *_*Eby 9

使用以下命令创建MANIFEST.in文件:

recursive-exclude .
# other MANIFEST.in commands go here
# to explicitly include whatever files you want
Run Code Online (Sandbox Code Playgroud)

有关MANIFEST.in语法,请参阅http://docs.python.org/distutils/commandref.html#sdist-cmd.


小智 1

简单的解决方案,不要使用 setuptools 来创建源代码分发,针对该命令降级到 distutils:

from distutils.command.sdist import sdist
from setuptools import setup

setup(
    # ... all the usual setup arguments ...
    cmdclass = {'sdist': sdist},
)
Run Code Online (Sandbox Code Playgroud)