如何将另一个tox项目文件夹指定为tox项目的依赖项

19

我们有一个启用了 tox 的项目(让我们称之为“主”项目),它依赖于另一个 tox 项目(让我们称之为“库”项目)-全部统一在一个仓库中,因为它们都是一个大型综合项目的一部分。

对于普通用户的项目工作方式

对于普通用户的常规安装,您只需从仓库或其他来源安装“库”项目,然后再安装“主”项目,然后运行它。

我们使用 tox 遇到的问题

然而,作为开发者,情况就不同了,因为“tox”应该工作,并且您可能希望同时拥有多个版本。

您通常会检出大型综合仓库,然后文件系统布局如下:

overarchingproject/main/
overarchingproject/main/src/
overarchingproject/main/tox.ini
overarchingproject/main/setup.py
...
overarchingproject/library/
overarchingproject/library/src/
overarchingproject/library/tox.ini
overarchingproject/library/setup.py
...

现在,如果我进入main/文件夹并输入“tox”,会发生以下情况:

  1. 当前行为: 它将尝试使用对“library”的依赖来构建“main”项目 - 这显然会尝试从pip获取“library”。然而,该项目尚未发布(因此不在pip上),所以它无法正常工作 - 即使该库就在同一个仓库中。

    结果:它不起作用。

    解决方法 1: 我们可以设置自己的软件包索引或要求用户这样做。但是,要求每个为项目做贡献的人使用DevPI或类似工具来运行单元测试似乎不是一个好主意,因此我们需要集中处理。

    但是,如果我们在某个中心位置提供软件包索引或“library”的pip软件包,人们将不能轻松地使用他们自己创建的“library”的修改版本来运行“main”的测试:

    "library"毕竟在同一个仓库中,所以人们可能会在某个时候进行修改。

    在“main”项目文件夹中键入“tox”将不会轻松地检测到相邻的“library”版本,而只有一个在线预打包的东西,这并不是很直观。

    解决方法 2: 我们尝试了sitepackages=True并在系统中安装“library” - 然而,sitepackages=True给我们带来了相当多的麻烦,并且它在一般情况下似乎不是一个好主意。

  2. 期望的行为: 我们想要tox使用文件夹中的本地版本“library”,该文件夹与跨越整个仓库的项目在同一个层次结构下,用户通常会获得它们:

    这个版本可能是更新的甚至是本地修改的,因此这显然是开发人员想要使用的版本。 它确实存在,而现在不能说pip软件包也存在。

为什么我们需要跨越多个子项目(“main”,“library”等)的总体仓库,而不仅仅是一个单一项目?

我们开发了一个多守护进程的大型项目,其中包含许多用于各种目的的守护进程,在某些库中共享代码以形成大学课程管理系统(涉及论坛、带有提交功能的课程管理、适用于学生项目的附加代码版本控制系统等)。

可以只使用一部分守护进程,因此将它们分开成不同的项目是有意义的,但它们仍然足够相互关联,以至于大多数人都希望拥有它们中的大部分 - 因此所有它们都在一个存储库中。

该库本身也适用于完全不同的项目,但通常用于我们的项目 - 因此它被塞到了存储库中。 因此,这意味着它始终在给定的相对路径中存在,但它有自己的tox.ini和单元测试。

TL;DR / 摘要

那么我们如何使tox在安装项目时查找另一个可toxable的项目文件夹中的特定依赖项,而


1
你最后解决了吗?我也遇到了类似的问题。谢谢。 - novemberkilo
正如您所看到的,我们仍在努力解决这个限制(请参见下面的响应)。 tox邮件列表上的讨论可以在此处找到:http://lists.idyll.org/pipermail/testing-in-python/2014-August/006084.html - 不幸的是,迄今为止没有遇到任何有用的建议。 目前看来,这似乎只是tox的一个限制。 - E. T.
4个回答

17
您可以在主项目中使用pip的--editable选项,如下所示:

您可以在主项目中使用pip的--editable选项,如下所示:

deps =
    --editable=file:///{toxinidir}/../library
    -r{toxinidir}/requirements.txt

注意,不要使用这个样式:-e file:///{toxinidir}/../library,因为tox会将整个字符串作为参数传递给argparse,在错误格式中会出现问题。


1
嘿,谢谢你的想法!似乎是个不错的尝试,但tox在一个 pip运行中提供了两个参数,而pip似乎不支持这样做,正如IRC上一位热心人所发现的:https://gist.github.com/mgedmin/2f2132ead2999a5e2077 Tox需要调用pip两次,但我想没有简单的方法可以实现这一点? - E. T.
2
@JonasThiem tox可以通过tox.ini中的install_command选项运行您提供的任何命令。这意味着您可以运行bash。至于您提供的要点,我不确定实际问题是什么。 - diabloneo

5

如在 diabloneo的回复中所建议,可以在tox.ini文件中提供install_command

我使用了这个方法来创建一个bash脚本,该脚本使用所有常规pip参数运行pip,但首先仅使用pip install --editable="file://`pwd`/../path/to/neighbour/repo"运行pip,然后再使用脚本的参数(如由tox直接传递给pip的参数)实际运行常规的pip install $@。然后,我使用这个脚本代替了默认的pip命令进行了install_command

通过这个两步骤的过程,它可以很好地工作:-)


0

distshare 在一些 tox 3 的次要版本中已被弃用,并在 tox 4 中移除。但应该适用于旧版本。 - undefined

-5

你应该尝试使用像 ansible 这样的分离工具。

例如

  1. ansible 创建并运行您的虚拟环境
  2. ansible 安装本地依赖项,如您的子项目
  3. 在每个子项目中使用 tox 运行测试、检查和文档

这是一种更方便的方法来处理 subprojects。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接