在buildout.cfg中指定优先级以获取egg包

1 投票
1 回答
589 浏览
提问于 2025-04-16 11:02

我在想,有没有办法先指定从哪里获取包,而不是直接去 pypi.python.org/ 上找。

举个例子:

[buildout]
find-links:
    /home/eggs/

eggs =
    foo
    bar

如果在 pypi 上有一个叫 foo 或者 bar 的包,它的版本号比我在 /home/eggs/ 目录下的 foo 包要高,buildout 就会试图从 pypi 下载这个包。可是我自己这个 foo 和 pypi 上的 foo 是完全不同的,这就成了一个问题。

我找不到使用命名空间或者类似的东西,所以我想应该有办法强制 buildout 使用某些特定的包,而不是其他的。

有没有什么办法可以解决这个问题呢?

谢谢,
马丁

1 个回答

4

你应该把你的“蛋”(这里指的是软件包)固定到特定的版本,这样每次运行构建时,你都能控制使用哪些“蛋”:

[buildout]
versions = versions

[versions]
foo = 1.0
bar = 1.1
spam = 1.0b2

[buildout] 部分的 versions 选项中,你可以指定一个包含你软件包版本固定信息的部分。在这个例子中,我把这个部分命名为 [versions],但你可以随便取个名字;比如可以想象有 [release1][release2] 这两个部分,versions 选项可以指向其中一个,以选择特定的版本组合。

当一个“蛋”被固定到某个特定版本时,只有这个版本的“蛋”才能满足这个构建的要求。如果你的链接指向一个包含该版本的地方,那么这个“蛋”就会从那里下载,而不是从PyPI(Python的包管理网站)下载。

还有两个构建功能可以帮助管理版本固定。第一个是一个默认的构建选项,叫做 allow-picked-versions

[buildout]
allow-picked-versions = false

默认设置是 true,这意味着构建可以为你选择一个满足所有要求的版本。如果你把这个设置为 false,那么对于任何没有版本固定的“蛋”,构建会报错。你可以用这个来检查是否还有“蛋”需要固定版本。

另一个选项是使用 buildout.dumppickedversions 扩展来增强构建:

[buildout]
extensions = buildout.dumppickedversions

当你把它添加到你的构建中时,每次运行构建时,最后会列出一个未固定版本的“蛋”的版本列表,这个列表的格式可以直接用在你的构建配置中。这样,你可以让构建找出要使用哪些“蛋”,然后再把它们固定到那些版本。

撰写回答