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

Mar*_*tin 3 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我还将foo列为我的setup.py中的依赖项.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.

干杯,马丁

Mar*_*ers 10

您误解了buildout的工作原理.

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

它将以递归方式执行此操作,直到满足所有依赖关系.所以,如果你指定要使用一种称为鸡蛋foo取决于bar,而这又依赖于spambacon,扩建将定位这四个鸡蛋给你.

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

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

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

所有你需要做的是列表全部依赖从善变进来[sources]auto-checkout(每行一个).在您的情况下,依赖项运行bar- > foo- > pack1,并通过列表foopack1mr.developer控制的配置,您确保buildout将找到这两者的开发蛋.

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