Python项目需要MANIFEST.in吗,里面应该有什么?

157 投票
2 回答
90789 浏览
提问于 2025-04-18 13:10

“Python Distribute”指南告诉我,在MANIFEST.in文件中要包含doc/txt文件,而.py文件则要排除在外。

则告诉我,只有sdist使用MANIFEST.in,并且只包括你指定的文件,还要包括.py文件。它还告诉我可以使用python setup.py sdist --manifest-only来生成一个MANIFEST,但是python告诉我这个文件不存在。

我知道这些内容来自不同版本的python,而且分发系统非常混乱,但假设我使用的是python 3和setuptools(这个新的工具包含了distribute,但现在叫setuptools,而不是之前被弃用的旧setuptools,旧的工具只为distribute服务,后来又被重新整合进distribute,distribute也改名为setuptools……)

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

  1. 我需要一个MANIFEST.in吗?
  2. 里面应该包含什么?
  3. 这些不同的包系统和方法什么时候能合并成一个简单的流程?

2 个回答

21

老问题,新答案:

不,你不需要 MANIFEST.in。不过,为了让 setuptools 按你想要的方式工作,你确实需要使用 setuptools_scm,它在两个关键地方替代了 MANIFEST.in

  • 它确保在运行 sdist 命令时,所有相关的文件都被打包(这里的“所有相关文件”指的是“所有在版本控制下的文件”)
  • 当使用 include_package_data 将包数据作为 buildbdist_wheel 的一部分时(同样是:在版本控制下的文件)

关于 MANIFEST.in 的历史理解是:当你没有版本控制系统时,你需要其他机制来区分“源文件”和“恰好在你工作目录中的文件”。不过,你的项目是有版本控制的,对吧?所以不需要 MANIFEST.in更多信息请查看这篇文章

146

关于“我需要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.txt,还会添加 README.rst,以及 docs 文件,可能还会有一些测试套件的数据文件,如果需要的话。

例如:

include README.rst
include COPYING.txt

要测试它,可以运行 python setup.py sdist,然后检查在 dist/ 目录下创建的压缩包。

这些不同的包系统什么时候会...

对比现在和两年前的情况,情况好多了——setuptools 是更好的选择。你可以忽略 distutils 有点问题的事实,因为它是 setuptools 的低级基础,而 setuptools 会帮你隐藏这些问题。

编辑:在我最近的几个项目中,我使用 pbr 来构建发布包,只需要三行 setup.py,其余的都在 setup.cfgrequirements.txt 中。这样就不需要担心 MANIFEST.in 和其他奇怪的东西了。虽然这个包确实需要更多的文档。可以查看 http://docs.openstack.org/developer/pbr/

撰写回答