Buildout:通过Mercurial包含另一个Python项目?

1 投票
3 回答
538 浏览
提问于 2025-04-15 18:34

我有一个项目叫做 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 个回答

-1

你正在使用一个叫做 mercurial 的工具,想要通过它来获取你想用作开发的一个配方(recipe)。但是这里面有个很复杂的循环依赖问题。

Buildout 需要这个 mercurial 的配方来运行它的 "mr" 部分。所以它从 pypi 上获取了这个配方。此时它还不知道这个配方实际上会去下载另一个配方。

0

如果你能查看或复制这个代码库,那么你就可以像平常一样开发这个Python模块:

[buildout]
...
develop = src/Bar
eggs = Bar
1

我找到的唯一解决这个问题的方法是给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

希望这对你有帮助。

撰写回答