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

时间:2014-06-25 14:22:54

标签: python dependencies setuptools setup.py tox

我们有一个启用了tox的项目(让我们称之为“主”项目),它依赖于另一个tox项目(我们称之为“库”项目) - 所有项目都集成在一个存储库中,因为它全部一个大型总体项目的一部分。

该项目如何为普通用户工作

对于作为最终用户的常规安装,您只需先从存储库或任何来源安装“library”然后“main”,然后运行它。

我们的问题是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. 当前行为:它将尝试构建依赖于“库”的“主”项目 - 这显然会导致尝试从pip获取“库”。但是,该项目尚未发布(因此不在点)因此它将无法工作 - 即使lib在同一个回购中就在那里。

    结果:无效。

    解决方法1:我们可以设置自己的包索引/要求用户这样做。但是,要求每个参与项目的人都使用DevPI或类似工具来运行单元测试似乎不是一个好主意,所以我们需要集中进行。

    但是如果我们在某个中心位置提供了包索引或者为“库”提供了一个pip包,那么人们就无法通过参与他们自己创建的“库”的修改版本轻松地运行“main”测试:< / p>

    “library”毕竟在同一个存储库中,因此人们可能会在某些时候修改它。

    在“主”项目文件夹中键入“tox”将不会轻易获取当前相邻的“库”版本,但只有预先打包的在线内容并不完全直观。

    解决方法2:我们尝试了sitepackages = True并在系统中安装“库” - 但是,sitepackages = True导致了我们显着的麻烦,一般来说这似乎不是一个好主意

  2. 期望的行为:我们希望tox在同一个总体存储库中使用该文件夹中的“库”的本地版本,人们通常会在这个存储库中获取一件事:

    该版本可能更新或甚至在本地修改,因此这显然是开发用户想要使用的版本。它存在,现在不能说关于pip包。

  3. 为什么我们仍然需要包含子项目(“主要”,“库”......)的总体存储库,而不仅仅是一个项目?

    我们开发了一个多守护程序大型项目,其中包含许多用于各种目的的守护进程,在一些库中共享代码以形成大学课程管理系统(处理论坛,课程管理,可以交出内容,附加代码版本控制系统)对于学生项目等。)。

    可以只使用守护进程的一个子集,因此它们是单独的项目是有道理的,但它们仍然足够连接,大多数人都希望拥有大部分 - 因此所有这些都在一个存储库中。 / p>

    库本身也适合用于完全不同的项目,但它通常用于我们的开头 - 因此它就是填充到存储库中的地方。这意味着它总是在给定的相对路径中,但它有单独的tox.ini和单元测试。

    TL; DR /摘要

    那么我们怎样才能让tox在另一个toxable项目文件夹中寻找特定的依赖项而不是在安装项目时只是pip?

    当然“main”的常规setup.py安装过程不应该乱用tox或搜索本地磁盘:它应该检查一个特定的相对路径,然后放弃,如果不存在(然后回到pip或其他任何地方。

    如果相对路径可以以某种方式存储在tox.ini中,那么最好。

    或者这只是一个非常糟糕的主意?我们是否应该以不同的方式解决这个问题,以使我们的“主要”项目能够轻松地使用本地存储库中存在的最新本地开发版“库”?

3 个答案:

答案 0 :(得分:10)

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

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

P.S。不要使用这种风格: -e file:/// {toxinidir} /../library ,因为tox将整个字符串作为参数传递给错误的foramt中的argparse。

答案 1 :(得分:2)

正如对diabloneo的回复的评论中所建议的那样,可以在tox.ini文件中提供install_command

我用它来创建一个bash脚本,它接受所有常用的pip参数,但之后只用pip install --editable="file://`pwd`/../path/to/neighbour/repo"运行pip,然后实际运行常规的pip install $@后面带有参数脚本(将由tox直接传递给pip)。然后我将此脚本与install_command一起使用,而不是使用常规的默认pip命令。

通过这个两步程序,它可以正常工作: - )

答案 2 :(得分:0)

您应该尝试使用诸如ansible之类的单独工具。

示例

  1. ansible创建并运行您的virtualenv
  2. ansible像子项目一样安装本地依赖项
  3. 在每个子项目中,使用tox运行测试,皮棉,文档

这是处理子项目的更方便的方法。