3

我正在使用 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

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

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

如何确保 mr.developer 真的去http://blah.com/hg/pack上获取 pack1, 如foo/buildout.cfg?

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

干杯,马丁

4

1 回答 1

10

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

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

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

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

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

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

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

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

于 2011-02-01T12:59:20.770 回答