python项目需要一个MANIFEST.in,应该包含什么?

Nei*_*ker 102 python setuptools

"Python Distribute"指南(位于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(包括分发但现在称为setuptools的新的,而不是仅用于分发工具的旧的setuptools)被重新分配并分发重命名为setuptools .....)

我正在遵循'标准'文件夹结构和setup.py文件,

  1. 我需要一个MANIFEST.in吗?
  2. 应该包括什么?
  3. 什么时候将所有这些不同的包装系统和方法组合成一个简单的过程?

Jan*_*sky 100

回复:"我需要一个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.txt,docs如果有必要的文件,可能还有一些数据文件的测试套件.

例如:

include README.rst
include COPYING.txt
Run Code Online (Sandbox Code Playgroud)

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

什么时候所有这些不同的包装系统......

比较今天和2年前的情况 - 情况要好得多 - setuptools是要走的路.你可以忽略这个事实,distutils有点破碎,是低水平的基础,setuptools因为你setuptools应该把这些东西藏起来.

编辑:我用最后几个项目pbr建设包分配有三个行setup.py和休息是setup.cfgrequirements.txt.无需关心MANIFEST.in和其他奇怪的东西.即使该软件包需要更多文档.见http://docs.openstack.org/developer/pbr/

  • 为了避免不可避免的`package_data`和`data_files`建议超出范围,我将继续.`package_data`将随你的软件包一起安装的文件列入`dist-packages/yourpackage`,因为它没有*.py名称而被跳过.`data_files`列出了在包外部安装的文件.每个条目指定一个以`sys.prefix`为前缀的目标路径,如果它是相对的或直接创建(权限允许),如果它以`/`开头. (6认同)
  • 根据我有限的经验,如果你想包含不在 python 模块中的文件(带有 __init__.py 的目录),你必须使用 MANIFEST.in 并使用 `sdist`(意思是:**源代码分发**)命令。如果你认为 `bdist` 和 `bdist_wheel` 是 **binary** 并且只打算安装在你的 python 路径中,这是有道理的。(这些非模块文件和目录会去哪里?在`/usr/local/lib/python2.7/dist-packages/`中吗?当然不是。)但值得一提的是,因为看到创建的存档令人困惑而它们没有包括文件。 (2认同)
  • @JanVlcinsky重要的是要知道是什么,并且[更重要的是] **不包含**在不同的发行格式中。我有一个公共项目,我仅通过源代码分发来分发,因为我在包的外部(在根目录中)包含了一个boto.sample.cfg文件(其中包含伪造的AWS IAM凭证),并且二进制分发版中将不包括该文件。我制作了私有二进制版本,用于部署到具有data_files = [('/ etc /',['boto.cfg'])]的生产环境中。如果要分发非py文件,则必须知道这些工作方式。 (2认同)
  • 为什么文档和测试需要进入`sdist`? (2认同)
  • @MichaelGoerz老实说,他们不应该.这个答案很古老,并且暗示`pbr`也是一个坏主意. (2认同)
  • @Ame 我同意,事情还在继续。目前我正在将大部分项目从 pbr 转换为 [poetry](https://pypi.org/project/poetry/) (2认同)

Kla*_*ven 13

老问题,新答案:

不,你不需要MANIFEST.in。但是,要setuptools完成您(通常)的意思,您确实需要使用setuptools_scm,它MANIFEST.in在两个关键位置发挥作用:

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

历史上的理解MANIFEST.in是:当你没有源代码控制系统时,你需要一些其他的机制来区分“源文件”和“碰巧在你工作目录中的文件”。但是,您的项目受源代码控制(对吗??),因此不需要MANIFEST.in. 这篇文章中有更多信息