【问题标题】:Nested buildout packages with mr.developer - Recursive buildout带有 mr.developer 的嵌套构建包 - 递归构建
【发布时间】:2011-02-01 05:53:42
【问题描述】:

我正在使用 mr.developer 从 mercurial 存储库中签出我的包,但我一定是做错了,因为我遇到了嵌套依赖项的问题。

例如,如果我有以下foo

  [buildout]
  develop = .

  extensions = mr.developer
  sources = sources
  auto-checkout =
      pack1
  parts = foo

  [sources]
  pack1 = hg http://blah.com/hg/pack1

foo 依赖于 pack1,在 setup.py 中列为 install_requires = ['pack1'],

当我运行bin/buildout 时,一切都很顺利,mr.developer 下载了 pack1,并且由于 pack1 已下载,foo 被创建而没有问题,因此存在。

现在,我有另一个包 bar,它将 foo 列为依赖项。

  [buildout]
  develop = .

  extensions = mr.developer
  sources = sources
  auto-checkout =
      foo
  parts = bar

  [sources]
  foo = hg http://blah.com/hg/foo

我还通过 install_requires = ['foo'], 在 setup.py 中将 foo 列为依赖项 现在发生的事情是我不明白的部分。

当我运行bin/buildout 时,mr.developer 会去获取 foo,但没有接缝来执行位于 foo/ 内部的 buildout.cfg。 因此, foo/setup.py 需要 pack1,但它并不存在。

foo/buildout.cfg 中所示,如何确保mr.developer 确实在http://blah.com/hg/pack 上获取pack1?

我希望能够像这样嵌套多个包,而不必深入每个包并手动运行 buildout。

干杯, 马丁

【问题讨论】:

    标签: buildout


    【解决方案1】:

    您误解了构建的工作原理。

    通常,buildout 会尝试找到为您构建零件所需的所有鸡蛋。它通过在您的站点包、PyPI 或任何其他 Web 位置(使用 find-links)中搜索鸡蛋(可选择固定到特定版本)来实现。

    它将递归地这样做,直到满足所有依赖项。因此,如果您指定要使用名为 foo 的鸡蛋,它依赖于 bar,而后者又依赖于 spambacon,buildout 将为您找到这四个鸡蛋。

    请注意,egg 是特殊的 python 包,使用 .egg 扩展名。如果有一个带有 setup.py 文件的 python 包,它指定了正确的名称,那么 setup.py 将被执行以动态创建一个鸡蛋。

    这是开发卵子进来的;它们是不需要从其他地方下载的 python 包,因为它们已经存在于文件系统中。它们的版本要求没有强制执行,如果存在,它们优先于在其他地方找到的其他版本的 egg。当 buildout 运行时,它们的 setup.py 会运行以就地构建一个 egg;当 buildout 运行时,您会在该包中找到一个 .egg-info 目录,并且更多元数据存储在 buildout 的 develop-eggs 目录中。

    在您的示例中,您使用 mr.developer 来管理您的开发鸡蛋,首先从 mercurial 存储库加载它们。 Buildout 本身并不真正关心这一点,它只是从 SCM 存储库加载 python 包并将它们视为 python 鸡蛋的一种(聪明的)方法。

    您需要做的就是列出来自[sources]auto-checkout 中的mercurial 的所有 依赖项(每行一个)。在您的情况下,依赖项运行 bar -> foo -> pack1,并通过在 mr.developer 控制的配置中列出 foopack1 确保构建将找到这两个的开发鸡蛋.

    在所有这些中,重要的是要记住,只需要一个扩展配置; buildout 不会运行包中的 buildout 配置文件。它只处理 python 鸡蛋,而不是其他构建配置。您有时确实会在 python Eggs 中找到构建配置文件,但这些文件是为 Egg 的开发人员提供的,用于运行测试和帮助开发,而不是在您自己的项目中用作 Egg 时引入依赖项。

    【讨论】:

    • Martjin,再次感谢您的帮助。很难找到关于构建的文档,我不知道没有你我会做什么。如果我做对了,对我来说最好的办法是为 foo 构建一个 egg,并将它的路径添加到 bar 的 find-links 中,如果我想确保没有省略依赖项(如果嵌套项目列表会变得很长)。
    • 我会避免在 setup.py 中使用查找链接;你真的想完全控制鸡蛋的来源。
    • @MartijnPieters:再次+1,以获得一些易于理解、有用且非常简洁的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 2020-06-17
    • 2018-08-28
    • 2022-06-21
    • 2020-07-17
    • 2017-07-02
    • 1970-01-01
    相关资源
    最近更新 更多