使虚拟环境中的现有包版本保持不变

Make Existing Package Version in Virtual Environment Stick

我有一个名为 backup-tool 的实用程序(虚构)。这具有直接依赖性 在名为 security-utils 的第三方库(又是虚构的)上。和这个 依赖项依赖于 cryptography(真正的依赖项)。所以, backup-toolcryptography 具有传递依赖性。没有特别的 backup-toolsecurity-utils.

均不需要版本

现在我有两台服务器:一台运行ning Linux,一台运行ning FreeBSD。我创建一个 Linux 和 运行 pip install backup-tool 上的虚拟环境。 一切正常。

在 FreeBSD 上,cryptography 2.9.2 版本无需任何安装即可 问题。但是,其他版本会导致构建失败。 (解决方法可能是 确实找到了,但这不是重点。)

现在我设置了一个虚拟环境并使用 pip install cryptography==2.9.2 预安装了正确的版本。稍后——这一切都在一个自动化的环境中进行设置 管道,我无法加入这两个步骤——我的工具是使用 pip install backup-tool 安装的。对 cryptography 的瞬态依赖被解析为 一个版本 3.x,它不起作用。

但是,如果我 运行 pip install backup-tool cryptography==2.9.2 在单个 步骤,一切正常。这意味着 backup-tool 兼容 cryptography 在版本 2.9.2.

我的问题:是否可以在虚拟环境中提示 pip 如果 cryptography 已经安装,则不应安装其他版本 那里? 也可以解析依赖树以匹配版本 已经安装,但选择了最新版本。

我可以在 requirements.txtsetup.py,共 backup-tool。但由于这是一个 环境而不是软件约束,这对大多数人来说都是无用的限制 设置。

您可以使用 constraints file 来限制 pip 在安装包时应该尝试的包版本范围。语法是需求文件的语法。

例如constraints.txt:

cryptography==2.9.2

为了让 pip 始终读取此约束文件,您可以设置环境变量:

export PIP_CONSTRAINT=constraints.txt

或者,在虚拟环境下,在 $VIRTUAL_ENV/pip.conf:

创建配置
[install]
constraint = constraints.txt

(路径相对于您的应用根目录)