Buildout:通过Mercurial包含另一个Python项目?
我有一个项目叫做 Foo/,里面有两个文件:buildout.cfg 和 setup.py。现在还有另一个项目叫 Bar/,它也有这两个文件。因为 Bar/ 依赖一些 Python 模块,所以它的 setup.py 里有 install_requires=['lxml', 'SQLAlchemy']
这一行。Foo/ 项目依赖于 Bar/。
但是 Bar/ 还没有发布版本。我该如何把 Bar/ 加入到 Foo 的 buildout 中,这样我就可以使用 Bar 的模块 lxml 和 SQLAlchemy 呢?
假设 Bar/ 是用 mercurial 作为版本控制系统。
我的尝试:Buildout mercurial recipe 这个工具并没有太多作用。它只是克隆了代码库,但并没有自动获取 Bar/setup.py 中的 install_requires 依赖,也没有把 Bar/ 加入到 sys.path 中。
实际例子:这是我的 buildout.cfg 文件的样子(Bar 是 mercurialrecipe 包):
[buildout]
parts = ... pyrtm ...
develop = . parts/pyrtm
eggs = pyrtm
[pyrtm]
recipe = mercurialrecipe
repository = http://bitbucket.org/srid/pyrtm
...
这样做不行,因为 sys.path 里没有本地克隆的 mercurialrecipe 的路径(在 parts/mr
里),而且依赖项(来自 parts/mr/setup.py
)也没有被安装。
3 个回答
你正在使用一个叫做 mercurial 的工具,想要通过它来获取你想用作开发的一个配方(recipe)。但是这里面有个很复杂的循环依赖问题。
Buildout 需要这个 mercurial 的配方来运行它的 "mr" 部分。所以它从 pypi 上获取了这个配方。此时它还不知道这个配方实际上会去下载另一个配方。
如果你能查看或复制这个代码库,那么你就可以像平常一样开发这个Python模块:
[buildout]
...
develop = src/Bar
eggs = Bar
我找到的唯一解决这个问题的方法是给buildout添加额外的路径:
[buildout]
parts = ... pyrtm ...
develop = . parts/pyrtm
eggs = pyrtm
extra-paths = parts/pyrtm/src
# or wherever your pyrtm folder
# could as well be extra-paths = pyrtm/
# if you your code is on same path as buildout.cfg.
[pyrtm]
recipe = mercurialrecipe
repository = http://bitbucket.org/srid/pyrtm
希望这对你有帮助。