使用mr.developer嵌套的buildout包 - 递归构建

时间:2011-02-01 05:53:42

标签: buildout

我正在使用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创建没有问题,因此存在。

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

  [buildout]
  develop = .

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

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

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

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

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

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

干杯, 马丁

1 个答案:

答案 0 :(得分:10)

你误解了扩建的工作原理。

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

它将以递归方式执行此操作,直到满足所有依赖项。因此,如果您指定要使用一个名为foo的鸡蛋,该鸡蛋取决于bar,而这取决于spambacon,则buildout会为您找到这四个鸡蛋

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

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

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

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

在所有这些中,重要的是要记住一个构建配置就是所需要的; buildout不会运行包内的buildout配置文件。它只处理蟒蛇蛋,而不是其他构建配置。你有时会在python egg中找到buildout配置文件,但是这些是针对egg的开发人员,运行测试和辅助开发,而不是在你自己的项目中用作egg时依赖性。