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,它简单地使插件没有任何查找器,并快速退出.
所以你看,这个答案虽然尽我所能,但仍然是令人尴尬的不完整.我实际上无法回答你的问题,但我认为答案是"你做不到".
使用以下命令创建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)
| 归档时间: |
|
| 查看次数: |
3479 次 |
| 最近记录: |