我正在使用Fabric来自动化我的项目的部署例程。
其中一个涉及virtualenv复制。
使用
自动安装新软件包非常简单local $ pip freeze > requirements.txt
remote $ pip install -r requirements.txt
现在,如果我不再需要包裹,我可以简单地
local $ pip uninstall unused_package
但由于pip install
不会删除要求中不存在的包裹,
如何自动从需求中不存在的virtualenv中删除软件包?
我想要一个像:
这样的命令remote $ pip flush -r requirements.txt
答案 0 :(得分:1)
为什么不只是一套带差异的差异?如果你在遥控盒上操作,可能需要使用get
操作
远程
from fabric.api import get, run
run("pip freeze > existing_pkgs.txt")
get("/path/to/existing_pkgs.txt")
所以现在existing_pkgs
在您的本地计算机上。假设您有一个新的需求文件...
with open("requirements.txt", "r") as req_file:
req_pkgs = set(req_file.readlines())
with open("existing_pkgs.txt", "r") as existing_pkgs:
existing = set(existing_pkgs.readlines())
执行一项操作,为您提供集合
的差异uninstall_these = existing.difference_update(req_pkgs)
然后从远程主机
卸载pkgsfor pkg in uninstall_these:
run("pip uninstall {}".format(pkg))
答案 1 :(得分:1)
另一种方法可能是 - 并且我知道这并没有完全回答你的问题 - 使用你已经拥有的virtualenv的力量:
通过修订控制标签识别已知的稳定包和应用程序环境,以便能够回滚到已知的工作组合(这不是测试或暂存环境的替代,虽然)。
所以你可以简单地设置一个新的虚拟环境("在你的标签上工作"),用" pip install -r"再次填充它。并留下旧的(一段时间,例如,直到新的你的标签版本被认为是稳定的)并最终删除旧的虚拟环境(' s)。
在您的fabfile中执行类似
的操作with cd(stage_dir):
run("./verify_virtual_env.sh %s" % your-tag)
和" verify_virtual_env.sh"脚本通过pip更新给定环境。
答案 2 :(得分:0)
我最后将安装/卸载作业分开。
安装:
pip install -r requirements.txt
卸载:
pip freeze | grep -v -f requirements.txt - | xargs pip uninstall -y