8

目前,当我们项目的 requirements.txt 更新时,我们从头开始重新构建我们的 virtualenv 以确保结果一致。问题是我们的 requirements.txt 很长,而且更新它通常只涉及一个包。

是否有任何系统可以将 virtualenv 与 requirements.txt 进行比较,并进行最少的更改以使它们匹配?

如果我可以让 pip 告诉我在给定 requirements.txt 的情况下它将安装哪些版本,我可能会自己写这个,但我没有看到这样的选项。

4

2 回答 2

5

通过 pip install 更新

我想知道为什么简单

$ pip install -r requirements.txt --upgrade

还不够吗?

它确实将当前的 virtualenv 与您的要求进行比较,并且只进行必要的更新。

删除不需要的包

关于删除不需要的包 - 这真的有必要吗?如果您真的坚持,我会创建unwanted-requirements.txt并在通过先前调用更新包之前执行:

$ pip uninstall -r unwanted-requirements.txt

然后是 $ pip install ...`

如果你保持你的系统和你想的一样一致,这应该会很好地工作,如果你犯了错误unwanted-requirements.txt,你的系统很可能会继续存在,因为未使用的包在大多数情况下是无害的,并且删除了想要的包应该会恢复由随后$ pip install ...

加快安装速度

如果您真正关心的不仅是安装一致,而且还要快速更新它们,那么有很多工作方法可以加快速度。请参阅我的 SO 答案https://stackoverflow.com/a/18520729/346478

于 2014-05-05T21:36:32.470 回答
1

我们这样做:当提交提交时(我们使用 git),它会触发一个钩子,该钩子执行一个自定义编写的 bash 脚本,该脚本激活 virtualenv,运行 pip install -r requirements.txt 检查所有内容是否是最新的并安装只有需要升级和停用 virtualenv 的软件包。

我不知道这是否对您有用,因为您没有发布有关您的环境的详细信息,但您明白了。此外,你的 requirements.txt 有多长也没有关系,因为如果你完全重建你的 virtualenv,pip 只会重新安装一些包,而不是从头开始安装所有东西。

编辑:

如果您还需要卸载不在 requirements.txt 中的软件包,您可以使用类似的东西:

pip freeze | grep -v -f requirements.txt - | xargs pip uninstall -y

只有在那之后:

pip install -r requirements.txt
于 2014-05-05T15:44:56.480 回答