2013-09-28 79 views
0

我正在使用Fabric来自动化我的项目部署例程。Virtualenv - 自动化项目需求部署

其中之一涉及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

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

安装:

pip install -r requirements.txt 

卸载:

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

为什么不直接用集的差异?如果你在遥控盒

运行在远程

from fabric.api import get, run 

run("pip freeze > existing_pkgs.txt") 
get("/path/to/existing_pkgs.txt") 

它可能需要使用get操作虽然所以现在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) 

然后从远程主机

for pkg in uninstall_these: 
    run("pip uninstall {}".format(pkg)) 
+0

似乎是个好主意,我给它一个尝试 –

1

另一个卸载的pkgs差异的操作方法可能是 - 并且我知道这并不完美地回答你的问题 - 使用你已经拥有的virtualenv的力量:

通过修订控制标记来确定稳定的包和应用程序环境,以便能够回滚到已知的工作组合(但这不能替代测试或临时环境),这样很方便。

所以,你可以简单地设置一个新的虚拟环境(“workon你的标签”),以“画中画安装-r”重新填充它,然后将旧的背后(有一段时间,例如直到新的标签发布被认为是稳定的),最后删除旧的虚拟环境('s)。

在你fabfile通过PIP对于给定的环境做一些像

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

和 “verify_virtual_env.sh” 脚本更新。

+0

不错的答案.... – Greg