除了zc.buildout和virtualenv,还有什么好的替代方案用于安装非Python依赖吗?
我所在的团队即将推出一个基于Python(具体来说是Django)的网页和一套后台工具。最近几周,团队的人数从2个增加到了4个,我们预计在接下来的几个月里还会继续增长。现在我们遇到的一个问题是,如何让每个人都能顺利配置好自己的开发环境,并安装好所有需要的依赖包。
我在寻找一些方法来简化这个过程,让它出错的可能性更小。zc.buildout和virtualenv看起来是解决这个问题的好工具,但它们主要关注的是Python相关的问题。我们还有一些用其他语言(特别是Java和Ruby)写的小项目,以及许多需要本地编译的Python扩展(比如lxml和MySQL驱动)。实际上,最让我们头疼的就是如何让这些扩展与合适版本的共享库一起编译,以避免出现段错误、内存分配错误等各种问题。而且,我们团队里有4个人,结果每个人的开发环境都不一样——有的是Leopard在PPC上,有的是Leopard在Intel上,还有Ubuntu和Windows。
理想情况下,我们希望有一个工具,能够像这样在命令行中运行:
$ git clone [repository url] ... $ python setup-env.py ...
这个工具能够完成zc.buildout和virtualenv的功能(复制或创建Python解释器的链接,提供一个干净的空间来安装依赖包),然后安装所有需要的依赖包,包括任何本地共享库的依赖,同时还要安装Ruby项目、Java项目等等。
显然,这个工具不仅对搭建开发环境有帮助,也能在测试和生产服务器上部署时派上用场。
我希望这个工具是用Python编写的,或者可以通过Python扩展,因为这一直是我们团队的共同语言,但我也愿意接受其他语言的解决方案。
所以,我想问问大家,有没有更好的替代方案,或者有没有人能分享使用这些解决方案来处理更大范围安装的经验?
6 个回答
我总是在项目的最上层创建一个 develop.py
文件,并且还有一个 packages
文件夹,里面放着我想要安装的所有 .tar.gz
文件,这些文件来自PyPI(Python的包管理网站)。此外,我还放了一份已经解压好的 virtualenv
,可以直接从这个文件运行。所有这些内容都会放到版本控制里。每个开发者只需检出主干代码,运行 develop.py
,过一会儿就能得到一个准备好的虚拟环境,里面包含了我们所有的依赖包,而且版本和其他开发者使用的一模一样。即使PyPI服务出现问题,这个方法也能正常工作,这在现在这个服务的历史阶段非常有用。
Setuptools 可能比你想象的更能满足你的需求。例如,如果你需要在 MacOS X 上正确运行 lxml 的自定义版本,你可以在 setup.py 文件里放一个合适的链接,这样 setuptools 就会自动下载并安装到开发者的环境中;它还可以被设置为从版本控制系统中下载和安装特定版本的依赖包。
不过,我更倾向于使用脚本生成的虚拟环境。创建一个启动文件来安装你所依赖的包是相当简单的,然后可以用它来启动虚拟机(或者生产环境的硬件!),同时用 puppet 或类似的软件来做其他管理工作(比如添加用户、设置服务[你的数据库从哪里来?]等等)。当你的生产环境包含多台机器时,这种方法特别有用——只需编写脚本生成多个虚拟机,并把它们放在一个方便的小网络里(我使用 libvirt+kvm;虽然 kvm 并不是所有开发者使用的平台都有,但 qemu 是可以的,或者你可以像我一样,使用少量强大的虚拟机主机供多个开发者共享)。
这样可以避免支持多个平台的麻烦——你只需支持一个虚拟平台——而且你的部署过程(由启动文件和用于设置的 puppet 代码定义)也像其他所有东西一样,经过版本控制,并通过你的质量保证和审核流程。