python项目需要MANIFEST.in吗,应该在其中吗?


120

“ Python分发”指南(位于python-distribute.org,但注册已失败)告诉我包括doc/txt文件,并且.py文件中排除了MANIFEST.in文件

sourcedist文档告诉我只有sdist用途MANIFEST.in,并只包括文件指定和包含.py文件。它还告诉我使用:python setup.py sdist --manifest-only生成一个MANIFEST,但是python告诉我这不存在

我很欣赏它们来自不同版本的python,并且分发系统完全混乱,但是假设我使用的是python 3,并且setuptools(新的包括distribution,但现在称为setuptools,而不是不赞成仅用于分发工具的旧setuptools重新分配到发行版,并将发行版重命名为setuptools .....)

我遵循的是“标准”文件夹结构和setup.py文件,

  1. 我需要一个MANIFEST.in吗?
  2. 应该是什么?
  3. 所有这些不同的包装系统和方法何时才能形成一个简单的过程?

Answers:


117

回复:“我需要一个MANIFEST.in吗?

不,您不必使用MANIFEST.in。两者,distutils并且setuptools被包括在源分发包中提到的所有文件setup.py-的模块,包Python文件, README.txttest/test*.py。如果这是分发包中所需的全部内容,则不必使用MANIFEST.in

如果要操纵(添加或删除)要包括的默认文件,则必须使用MANIFEST.in

回复:里面应该有什么?

程序很简单:

  1. 确保在您中setup.py(包含setup参数)包含对程序运行至关重要的所有文件(模块,程序包,脚本...)

  2. 澄清一下,是否有要添加的文件或要排除的文件。如果都不需要,则无需使用MANIFEST.in

  3. 如果MANIFEST.in需要,请创建它。通常情况下,你添加有tests*/*.py文件,README.rst如果你不使用README.txtdocs如果有必要的文件,可能还有一些数据文件的测试套件。

例如:

include README.rst
include COPYING.txt

要对其进行测试,请运行python setup.py sdist并检查在下创建的tarball dist/

这些不同的包装系统何时会...

比较今天和2年前的情况-情况要好得多- setuptools是要走的路。您可以忽略一个事实,distutils它有点破损,并且是低级别的基础,setuptools因此setuptools请注意对您隐藏这些东西。

编辑:我使用的最后几个项目pbr用于构建分发包,其中三行setup.py,其余部分在setup.cfg和中requirements.txt。无需关心MANIFEST.in和其他奇怪的东西。即使该软件包值得更多文档。参见http://docs.openstack.org/developer/pbr/


1
以我有限的经验来看,如果您想包含不在python模块内的文件(带有init .py的目录),则必须使用MANIFEST.in并使用sdist(means:source distribution)命令。如果您认为bdistbdist_wheel二进制的,并只用于安装在你的Python路径,这是有道理的。(这些非模块文件和目录在/usr/local/lib/python2.7/dist-packages/哪里?肯定不会。)但是值得一提的是,因为看到创建的归档文件很混乱,而且它们不包含文件。
布鲁诺·布鲁诺斯基

7
为了阻止不可避免package_datadata_files建议,这是超出了范围,我会继续下去。package_data列出随软件包一起安装的文件,dist-packages/yourpackage由于没有* .py名称,因此该文件将被跳过。data_files列出在软件包外部安装的文件。每个条目都指定一个目标路径,sys.prefix如果它是相对路径,则以该路径为前缀;如果以开头,则直接创建(允许)/
Bruno Bronosky

2
@JanVlcinsky重要的是要知道什么是[更重要的 ] 不包含在不同的发行格式中。我有一个公共项目,我只能通过源代码分发来分发,因为我在程序包的外部(在根目录中)包含了一个boto.sample.cfg文件(其中包含伪造的AWS IAM凭证),并且二进制发行版中也没有包含该文件。我制作了私有二进制版本,用于部署到具有data_files = [('/ etc /',['boto.cfg'])]的生产环境中。如果要分发非py文件,则必须知道这些工作方式。
布鲁诺·布鲁诺斯基

2
@MichaelGoerz老实说,他们不应该。这个答案很古老,建议pbr也不是一个好主意。
Arne

1
@Ame我同意,事情继续发展。目前,我正在将大部分项目从pbr转换为诗歌
Jan Vlcinsky 18/12/28

7

旧问题,新答案:

不,您不需要MANIFEST.in。但是,要setuptools执行您(通常)的意思,您确实需要使用setuptools_scm,它MANIFEST.in在2个关键位置扮演角色:

  • 它确保在运行sdist命令时打包所有相关文件(其中所有相关文件都定义为“源代码控制下的所有文件”)
  • include_package_data用于将包数据包括为build或的一部分时bdist_wheel。(再次:在源代码控制下的文件)

历史上的理解MANIFEST.in是:当您没有源代码控制系统时,您需要其他机制来区分“源文件”和“碰巧在您的工作目录中的文件”。但是,您的项目处于源代码控制之下(正确吗?),因此不需要MANIFEST.in本文中的更多信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.