Virtualenv - 自动化项目需求部署

时间:2013-09-28 09:43:08

标签: deployment virtualenv pip fabric

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

3 个答案:

答案 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)

然后从远程主机

卸载pkgs
for 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