目前,当我们项目的 requirements.txt 更新时,我们从头开始重新构建我们的 virtualenv 以确保结果一致。问题是我们的 requirements.txt 很长,而且更新它通常只涉及一个包。
是否有任何系统可以将 virtualenv 与 requirements.txt 进行比较,并进行最少的更改以使它们匹配?
如果我可以让 pip 告诉我在给定 requirements.txt 的情况下它将安装哪些版本,我可能会自己写这个,但我没有看到这样的选项。
目前,当我们项目的 requirements.txt 更新时,我们从头开始重新构建我们的 virtualenv 以确保结果一致。问题是我们的 requirements.txt 很长,而且更新它通常只涉及一个包。
是否有任何系统可以将 virtualenv 与 requirements.txt 进行比较,并进行最少的更改以使它们匹配?
如果我可以让 pip 告诉我在给定 requirements.txt 的情况下它将安装哪些版本,我可能会自己写这个,但我没有看到这样的选项。
我想知道为什么简单
$ 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
我们这样做:当提交提交时(我们使用 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