在我看来,正确的答案是否定的,但你会发现很多安装测试的发行版。不应安装测试,但应将它们包含在源代码分发中。在我看来,在理想情况下,测试安装的包应该是包管理器(pip)执行的任务,并且site-packages
目录不应该被测试源污染。
我最近研究了这个主题并从各种来源收集了信息,并发现了几种不同的方法来构建包含库源和测试的发行版的目录/包层次结构。这些结构中的大多数似乎已经过时了,它们的发明是为了解决当时旧分发系统的不完整功能集。不幸的是,许多在线资源(较旧的博客文章/文档)仍在宣传过时的方法,因此通过在线搜索很容易找到过时的分发方法/教程。
假设您有一个名为“my_lib”的库,并且您想要构建您的发行版的源代码。我将展示两种流行且看似过时的方式来构建您的发行版,以及第三种我发现是最通用的方式。第三种方法也可能已经过时,但这是我在发布此答案时所知道的最好的方法。;-)
方法#1
(有意或无意地)安装测试的发行版通常使用这种方法。
等级制度
+- my_lib
| +- __init__.py
| +- source1.py
| +- source2.py
| +- tests
| +- __init__.py
| +- test_1.py
| +- test_2.py
+- setup.py
方法#2
未安装测试,但它们应通过MANIFEST.in
文件包含在源代码分发中。
等级制度
+- my_lib
| +- __init__.py
| +- source1.py
| +- source2.py
+- tests
| +- __init__.py
| +- test_1.py
| +- test_2.py
+- setup.py
方法#3(我更喜欢这个。)
这与方法#2 非常相似,但略有不同(src
目录)。
等级制度
+- src
| +- my_lib
| +- __init__.py
| +- source1.py
| +- source2.py
+- tests
| +- __init__.py
| +- test_1.py
| +- test_2.py
+- setup.py
setup.py 中的 setup() 调用
from setuptools import setup, find_packages
setup(
...
packages=find_packages('src'),
package_dir={'': 'src'},
...
)
清单文件
recursive-include tests *.py
不会安装测试,但它们将通过我们的MANIFEST.in
.
在方法#3 的情况下,您的src
目录通常只包含一个包,该包是您的 lib 的根目录。将my_lib
包放入src
目录(目录而不是包,因此您不需要src/__init__.py
)具有以下好处: