更新virtualenv以匹配requirements.txt

时间:2014-05-05 14:53:34

标签: python pip virtualenv requirements.txt

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

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

我可以自己写这个,如果我能得到pip告诉我安装哪个版本给出一个requirements.txt,但我没有看到这样的选项。

2 个答案:

答案 0 :(得分: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 ...

中恢复

加速安装

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

答案 1 :(得分:0)

我们这样做:当发出一个提交(我们使用git)时,它触发一个钩子,它执行一个自定义编写的bash脚本,激活virtualenv,运行pip install -r requirements.txt,检查一切是否达到date并仅安装需要升级的软件包并停用virtualenv。

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

修改

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

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

只有在那之后:

pip install -r requirements.txt