如何通过RPM分发Python/Django应用
我看过这个问题,觉得这是个不错的开始,但我想要更多的见解。
我用Python 2.6和Django 1.2.1写了一个应用程序。我想把这个应用部署到一个没有安装Python 2.6或Django的系统上。这个系统本身安装的软件不多,只有sqlite3、pysqlite2、gcc等。不过,它有Python 2.4.3。
我想知道,最合理的方法是什么,来创建Python 2.6、Django和我自己的应用程序(一个标准的Django应用)的RPM包,这样每个部分都可以单独安装,以便于不同组件的升级?
我对创建源RPM包了解不多,但我觉得这方面的信息应该很容易找到。如果有特别好的资源来创建源RPM包,我也很感兴趣。
这个系统是ESX 4 Update 1,如果这有关系的话。
谢谢!
更新:我之前没想到分发Python eggs或者使用setup.py也是一种可行的内容分发方案。我也很想听听这方面的内容。
5 个回答
可以参考Python文档的第5章。这部分内容会教你如何使用bdist这个Python工具。通过这个工具,你可以生成多种类型的包(或者说是“构建的分发版”),包括RPM格式的包。
在打包Python代码时,除了遇到一些正常的问题,Django项目还有一些额外的问题需要处理:
- 与系统路径的兼容性
- 与系统功能的兼容性
- 处理翻译问题
- 随机生成密钥
我在为Transifex打包时遇到了这些问题,建议你了解一下为了解决这些问题而采取的各种措施:
- 安装在
/usr/share/<项目名称>
目录下 - 使用
execfile()
从/etc/<项目名称>
加载设置 - 处理翻译时的复杂流程
- 在安装后脚本中替换密钥
- 所有其他繁琐的修改和调整
Python的包通常是通过setuptools/distribute来分发的。一般来说,你可以用easy_install <package_name>
来安装任何Python包(包括它的依赖包),你也可以选择安装特定版本。我建议你使用setuptools作为主要的分发方式,原因有以下几点:
- 它在所有平台上都能使用
- 这是Python包的推荐安装方式
- .rpm或.deb安装脚本也可以重用它的一部分
- 你可以在virtualenv中安装这些包,而不需要管理员权限,这样就不会和服务器上其他已安装的网络应用产生冲突
你可以阅读使用Distribute进行部署这篇文章。虽然它主要讲的是Flask(另一个网络框架),但只要把“Flask”换成“Django”就可以了 :)
另一个很适合分发和部署的Python工具是fabric,你可以把它和distribute一起使用(或者单独使用,随你喜欢)。使用fabric,你可以一次性在多个服务器上启动并安装你的应用(包括依赖包),管理多个开发、测试和生产服务器,并且可以用一个命令同时更新它们。
这篇文章可能会帮助你入门Fabric:使用Fabric进行部署
另外,我还建议你把你的代码库发布到github或bitbucket上,供那些想手动获取最新源代码的人使用,然后可以用python setup.py install
来安装你的应用。setup.py安装脚本是我之前提到的distribute的一部分。