0

我正在使用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
4

3 回答 3

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)

然后从远程主机卸载 pkgs

for pkg in uninstall_these:
    run("pip uninstall {}".format(pkg))
于 2013-09-29T07:44:11.833 回答
1

另一种方法可能是 - 我知道这不能完美地回答你的问题 - 使用你已经拥有的 virtualenv 的力量:

拥有已知的稳定包和应用程序环境是很方便的,比方说由修订控制标签标识,以便能够回滚到已知的工作组合(尽管这不能替代测试或暂存环境)。

因此,您可以简单地设置一个新的虚拟环境(“workon your-tag”),再次使用“pip install -r”填充它并留下旧的(一段时间,例如直到新的 your-tag 版本被认为是稳定的)最后删除旧的 virtual-env('s)。

在你的 fabfile 做类似的事情

with cd(stage_dir):
    run("./verify_virtual_env.sh %s" % your-tag)

并且“verify_virtual_env.sh”脚本通过 pip 更新给定环境。

于 2013-09-30T13:26:09.543 回答
0

我最终将安装/卸载作业分开。

安装:

pip install -r requirements.txt

卸载:

pip freeze | grep -v -f requirements.txt - | xargs pip uninstall -y
于 2014-05-15T14:56:11.303 回答