我正在使用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。
干杯, 马丁
答案 0 :(得分:10)
你误解了扩建的工作原理。
通常情况下,buildout会尝试找到为您制作零件所需的所有鸡蛋。它通过在您的站点包,PyPI或任何其他Web位置(使用find-links
)搜索鸡蛋(可选择固定到特定版本)来实现此目的。
它将以递归方式执行此操作,直到满足所有依赖项。因此,如果您指定要使用一个名为foo
的鸡蛋,该鸡蛋取决于bar
,而这取决于spam
和bacon
,则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控制的配置中列出foo
和pack1
,确保buildout可以为这两种配置找到开发阶段。
在所有这些中,重要的是要记住一个构建配置就是所需要的; buildout不会运行包内的buildout配置文件。它只处理蟒蛇蛋,而不是其他构建配置。你有时会在python egg中找到buildout配置文件,但是这些是针对egg的开发人员,运行测试和辅助开发,而不是在你自己的项目中用作egg时依赖性。