提问人:John 提问时间:10/2/2008 更新时间:10/31/2010 访问量:2601
除了 zc.buildout 和/或 virtualenv 之外,还有其他好的替代品来安装非 python 依赖项吗?
Are there any other good alternatives to zc.buildout and/or virtualenv for installing non-python dependencies?
问:
我是一个团队的成员,该团队即将推出一个基于 python(特别是 Django)的网站和随附的后端工具套件的测试版。在过去的几周里,团队本身的规模已经翻了一番,从2人增加到4人,我们预计至少在未来几个月内会继续增长。一个开始困扰我们的问题是让每个人都能快速配置他们的开发环境并安装所有正确的鸡蛋等。
我正在寻找简化此过程并使其不易出错的方法。zc.buildout 和 virtualenv 看起来都是解决这个问题的好工具,但两者似乎都主要集中在特定于 python 的问题上。我们有几个其他语言的小子项目(特别是 Java 和 Ruby),以及许多必须本地编译的 python 扩展(lxml、MySQL 驱动程序等)。事实上,我们这边最大的棘手问题之一是根据共享库的适当版本编译其中一些扩展,以避免段错误、恶意错误和各种类似问题。在 4 个人中,我们有 4 个不同的开发环境——1 个 leopard 在 ppc 上,1 个 leopard 在 intel 上,1 个 ubuntu 和 1 个 windows,这无济于事。
最终,理想的工作方式大致如下,来自 dos/unix 提示符:
$ git clone [存储库 URL] ... $ python setup-env.py ...
然后,它执行 zc.buildout/virtualenv 所做的工作(复制/符号链接 Python 解释器,提供一个干净的空间来安装 egg),然后安装所有必需的 egg,包括安装任何本机共享库依赖项,安装 Ruby 项目、Java 项目等。
显然,这对于启动开发环境以及在暂存/生产服务器上部署都很有用。
理想情况下,我希望通过python编写/可扩展完成此操作的工具,因为这是(并且永远是)我们团队的通用语言,但我对其他语言的解决方案持开放态度。
因此,我的问题是:是否有人对更好的替代方案有任何建议,或者他们可以使用这些解决方案之一来处理更大/更广泛的安装基础来分享任何经验?
答:
基本上,您正在寻找一个跨平台的软件/软件包安装程序(在apt-get/yum/etc.等行上)我不确定是否存在这样的东西?
另一种选择可能是指定需要通过特定于操作系统的软件包管理系统(如 Fink 或 Mac OS X 的 DarwinPorts)安装的软件包列表,并有一个脚本来为内部代码设置构建环境?
自从我发布问题以来,我一直在研究这个问题。看起来有一些尝试来解决我概述的一些需求,例如 Minitage 和 Puppet,它们采用了不同的方法,但两者都可以实现我想要的——尽管 Minitage 没有明确声明它支持 Windows。由于缺乏更好的选择,我将尝试使用其中之一或只是广泛自定义使用 zc.buildout 来满足我们的需求,但我仍然觉得一定有更好的选择。
可以考虑使用运行的任何生产操作系统创建虚拟机设备,并预先构建所有软件依赖项。代码可以远程编辑,也可以使用共享文件夹进行编辑。在前世的开发环境相当复杂的情况下,它对我来说效果很好。
Puppet 也不(容易)支持 Win32 世界。如果你正在寻找一种部署机制,而不仅仅是一个“开发设置”工具,你可以考虑研究ControlTier(http://open.controltier.com/),它有一个开源的跨平台解决方案。
除此之外,您正在查看“企业”软件,例如 BladeLogic 或 OpsWare,并且通常为所提供的功能提供高昂的价格标签(显然,我的观点)。
很多人一直在积极地使用 Puppet 和 Capistrano(甚至是非 Rails 开发人员)的组合来部署自动化工具,效果非常好。同样,不利的一面是,它期待一个有点同质的环境。
Setuptools 的功能可能比您意识到的要多——例如,如果您需要自定义版本的 lxml 才能在 MacOS X 上正常工作,您可以在 setup.py 中放置一个 URL 到适当的 egg,并让 setuptools 根据需要下载并安装在开发人员的环境中;还可以告诉它从版本控制下载和安装特定版本的依赖项。
也就是说,我倾向于使用脚本生成的虚拟环境。构建一个kickstart文件非常简单,该文件安装你所依赖的任何软件包,然后针对它启动虚拟机(或生产硬件!),使用puppet或类似软件进行其他管理(添加用户,设置服务[你的数据库来自哪里?],等等)。当您的生产环境包含多台机器时,这尤其方便 - 只需编写脚本即可在其方便的小沙盒子网中生成多个虚拟机(为此,我使用 libvirt+kvm;虽然 kvm 并非在开发人员使用的所有平台上都可用,但 qemu 肯定可用,或者您可以像我一样,让多个开发人员共享少量强大的 VM 主机)。
这使您摆脱了支持 N 个平台的麻烦 - 您只有一个虚拟平台可以支持 - 并且意味着您的部署过程(由用于设置的 kickstart 文件和 puppet 代码定义)是源代码控制的,并像其他所有事情一样贯穿您的 QA 和审查流程。
我总是在项目的顶层创建一个文件,并且还有一个目录,其中包含我要安装的 PyPI 中的所有文件,并且还包括一个解压缩的副本,可以直接从该文件运行。所有这些都进入版本控制。每个开发人员都可以简单地检查主干,运行 ,片刻之后,将有一个可供使用的虚拟环境,其中包括我们与其他开发人员正在使用的版本完全相同的所有依赖项。即使 PyPI 关闭,它也能正常工作,这在该服务历史记录的这一点上非常有用。develop.py
packages
.tar.gz
virtualenv
develop.py
评论