Python项目需要MANIFEST.in吗,里面应该有什么?
“Python Distribute”指南告诉我,在MANIFEST.in
文件中要包含doc/txt
文件,而.py
文件则要排除在外。
而MANIFEST.in
,并且只包括你指定的文件,还要包括.py
文件。它还告诉我可以使用python setup.py sdist --manifest-only
来生成一个MANIFEST
,但是python告诉我这个文件不存在。
我知道这些内容来自不同版本的python,而且分发系统非常混乱,但假设我使用的是python 3和setuptools
(这个新的工具包含了distribute,但现在叫setuptools,而不是之前被弃用的旧setuptools,旧的工具只为distribute服务,后来又被重新整合进distribute,distribute也改名为setuptools……)
而且我遵循的是“标准”的文件夹结构和setup.py
文件,
- 我需要一个
MANIFEST.in
吗? - 里面应该包含什么?
- 这些不同的包系统和方法什么时候能合并成一个简单的流程?
2 个回答
老问题,新答案:
不,你不需要 MANIFEST.in
。不过,为了让 setuptools
按你想要的方式工作,你确实需要使用 setuptools_scm
,它在两个关键地方替代了 MANIFEST.in
:
- 它确保在运行
sdist
命令时,所有相关的文件都被打包(这里的“所有相关文件”指的是“所有在版本控制下的文件”) - 当使用
include_package_data
将包数据作为build
或bdist_wheel
的一部分时(同样是:在版本控制下的文件)
关于 MANIFEST.in
的历史理解是:当你没有版本控制系统时,你需要其他机制来区分“源文件”和“恰好在你工作目录中的文件”。不过,你的项目是有版本控制的,对吧?所以不需要 MANIFEST.in
。更多信息请查看这篇文章。
关于“我需要MANIFEST.in吗?”
不,你不一定要使用 MANIFEST.in
。无论是 distutils
还是 setuptools
,它们都会把 setup.py
中提到的所有文件都包含在源代码发布包里,比如模块、包的Python文件、README.txt
和 test/test*.py
。如果你只想要这些文件在发布包里,那就不需要使用 MANIFEST.in
。
如果你想要调整(添加或删除)默认包含的文件,那就需要使用 MANIFEST.in
。
里面应该包含什么?
这个过程很简单:
确保在你的
setup.py
中,通过setup
的参数包含所有你认为对程序运行重要的文件(模块、包、脚本等...)明确是否有需要添加的文件或需要排除的文件。如果都不需要,那就不需要使用
MANIFEST.in
。如果需要
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.cfg
和 requirements.txt
中。这样就不需要担心 MANIFEST.in
和其他奇怪的东西了。虽然这个包确实需要更多的文档。可以查看 http://docs.openstack.org/developer/pbr/