<p>在我看来,正确的答案是否定的,但是你会发现很多安装测试的发行版。不应该安装测试,但它们应该包含在源代码分发中。在我看来,在理想情况下,测试已安装的包应该是由包管理器(pip)执行的任务,<code>site-packages</code>目录不应该被测试源污染。在</p>
<p>我最近研究了这个主题,收集了来自不同来源的信息,发现了几种不同的方法来构建包含库源和测试的发行版的目录/包层次结构。这些结构中的大多数似乎已经过时了,它们的发明是为了解决当时旧的配电系统的不完整特性集。不幸的是,很多在线资源(旧的博客文章/文档)仍然在宣传过时的方法,因此很容易通过在线搜索找到过时的发布指南/教程。在</p>
<p>假设您有一个名为“my_lib”的库,并且希望构建您的发行版的源代码。我将展示两种流行的、似乎过时的方法来构建您的发行版,第三种方法是我发现最通用的。第三种方法可能也过时了,但这是我所知道的最好的一种,即发布此答案的时间。;—)</p>
<h2>方法1</h2>
<p>(有意或无意)安装测试的发行版通常使用这种方法。在</p>
<p><strong>层次结构</strong></p>
<pre class="lang-none prettyprint-override"><code>+- my_lib
| +- __init__.py
| +- source1.py
| +- source2.py
| +- tests
| +- __init__.py
| +- test_1.py
| +- test_2.py
+- setup.py
</code></pre>
<h2>方法2</h2>
<p>未安装测试,但它们应该通过<code>MANIFEST.in</code>文件包含在源分发中。在</p>
<p><strong>层次结构</strong></p>
^{pr2}$
<h2>方法3(我更喜欢这个)</h2>
<p>这与方法2非常相似,只是有点扭曲(即<code>src</code>dir)。在</p>
<p><strong>层次结构</strong></p>
<pre class="lang-none prettyprint-override"><code>+- src
| +- my_lib
| +- __init__.py
| +- source1.py
| +- source2.py
+- tests
| +- __init__.py
| +- test_1.py
| +- test_2.py
+- setup.py
</code></pre>
<p><strong>setup()调用设置.py</strong></p>
<pre class="lang-py prettyprint-override"><code>from setuptools import setup, find_packages
setup(
...
packages=find_packages('src'),
package_dir={'': 'src'},
...
)
</code></pre>
<p><strong>清单.in</strong></p>
<pre class="lang-none prettyprint-override"><code>recursive-include tests *.py
</code></pre>
<p>不会安装测试,但它们将通过我们的<code>MANIFEST.in</code>包含在源代码分发中。在</p>
<p>对于方法3,您有一个<code>src</code>目录,该目录通常只包含作为lib根目录的单个包。将<code>my_lib</code>包放入<code>src</code>目录(目录而不是包,因此您不需要<code>src/__init__.py</code>)有以下好处:</p>
<ul>
<li>执行<code>setup.py</code>时,包含<code>setup.py</code>的目录将隐式添加到python路径中。这意味着在<code>setup.py</code>中,如果库的包与<code>setup.py</code>位于同一目录中,则可能会意外地错误地从库中导入内容。通过将<code>my_lib</code>包放入<code>src</code>中,我们可以避免这个问题。在</li>
<li><p>您可以轻松地使用分布式测试源来测试分布式库源和已安装的库:</p>
<ul>
<li>当您使用<code>setup.py test</code>运行测试时,<code>setup()</code>调用的<code>package_dir={'': 'src'}</code>部分保证您的测试将看到您保存在<code>src/my_lib</code>中的<code>my_lib</code>库包。在</li>
<li>也可以不使用<code>setup.py</code>运行测试。在最简单的情况下,您可以使用<code>python -m unittest</code>命令来完成此操作。在本例中,<code>src</code>dir不会是python路径的一部分,因此您可以使用此方法来测试库的已安装版本,而不是<code>src</code>中的源代码。在</li>
</ul></li>
</ul>