python 项目中同时包含 tox.ini 和 setup.cfg 是否有理由?

Is there a reason to have both tox.ini and setup.cfg in a python project?

我刚刚使用 PyScaffold 构建了一个 python 项目。引起我注意的一件事是脚手架生成了 setup.cfg 和 tox.ini 文件。如果我的理解是正确的,如果我使用 tox 命令使用 tox,它只会查看 tox.ini 文件并完全忽略 setup.cfg 和 setup.py。

在这种情况下,这是我的问题:是否有理由将它们都保留在项目中,或者仅使用 tox.ini 或 setup.cfg 就足够了?如果我必须将它们都保留在我的项目中,是否有一种简单的方法可以让它们都使用相同的配置(例如 运行 flake8 的配置用于 linting)而我不必在两个 setup.cfg 和 tox.ini?

让我们一步一步来。

PyScaffold 是一个试图简化新 Python 项目设置的工具。

什么是 Python 项目?

从根本上说,一个可执行 Python 文件就足够了。

如果你想让项目可以安装,你需要构建系统的配置文件。

虽然随着时间的推移发生了很多变化,但 setup.py 仍然是最突出的。在某个时间点发现,构建配置文件可以执行任意代码可能不是一个好主意,因此发明了 setup.cfg,您可以在其中定义例如ini 样式格式的项目名称和依赖项。同时,发明了另一种格式,即 pyproject.toml 文件。

所以基本上,要构建您的项目,您需要其中之一:

  • setup.py
  • setup.py和setup.cfg(前者只调用后者)
  • pyproject.toml

通常您想为项目编写测试。您可以使用内置 unittest 测试 运行ner 来 运行 您的测试,或者现在许多项目使用 pytestpytest 可以配置为 pytest.ini.

测试通常需要一些依赖,例如pytest 本身以及其他一些测试助手。它们需要在某个时候安装。

tox 发挥了作用。在许多其他功能中,例如运行针对不同的 Python 版本进行测试,tox 可以安装您的项目和测试要求并执行测试。 tox 通常带有一个 tox.ini 文件。

哦,linting 呢?您希望代码易于阅读并遵循 Python 准则(例如 PEP 8),因此您通常使用像 flake8 这样的工具 - 它也带有自己的配置文件,即 .flake8.

好的,现在我们有很多工具和很多配置文件,但这还不是全部。由于不是每个人都喜欢这么多的配置文件,所以有些工具支持使用其他工具的配置文件进行配置。

例如您可以在 setup.cfgtox.ini 中配置 flake8,请参阅 https://flake8.pycqa.org/en/latest/user/configuration.html

您还可以通过 setup.cfgpyproject.toml 配置 tox,请参阅 https://tox.readthedocs.io/en/latest/config.html#configuration-discovery

还有一件重要的事情要知道:您只需要配置一次您的工具,而不是在所有这些文件中。

因此,从技术上讲,您不需要所有这些文件,您认为什么是易于阅读和易于管理的项目设置取决于您。

在过去的 Python 爱尔兰 聚会上,我用 5 分钟的时间快速谈论了这一切是如何令人困惑以及我想出了什么解决方案:

https://youtu.be/8iqhNbDHC-c