openstack 的horizon项目支持通过插件的方式,将自开发的功能集成进dashboard里。关于插件方式集成,不是我们这里的重点,感兴趣的同学可以自行查阅。

        我们关心的是,当插件开发完毕后,如何将项目打包成可以在redhat系列的rpm的安装包,然后可以统一进行标准的安装。既然是python写的项目,那么我们先看看python是如何支持软件包的分发和安装的。参考这里,我们可以知道python已经提供了分发和包安装的方式:

1、源码包安装方式 python setup.py install

我们先来看一下源码包安装,其实就是适用python 标准库中的distutils或者是对distutils进行增强了的setuptools库,实现安装包生成和安装包安装。由于distutils属于最早的包安装标准库,并且setuptools 是对distutils的增强,他们的使用方式就是在项目的跟目录添加setup.py文件,在文件中引入setuptools或者disutils ,方式如下:

setup.py

from distutils.core import setup
 
setup(
    name="hello_module",
    version="1.0",
    author="xxx",
    author_email="xxxxxx@sh.com",
    py_modules=['hello'],
)

然后,然后通过 python setup.py sdist会在项目中生成了dist目录下,并且在该目录下会生成项目的分发包xxx.tar.gz ,然后用户可以通过拿到这个tar.gz的包,在需要安装的环境中,解压后,通过python setup.py install 的方式,将项目安装到python的安装目录后就可以正常试用。

2、通过包管理pip/easy_install进行在线安装 

         这里提供了一种比源码更方便的方式进行在线包安装。开发者完成软件的开发工作后,通过setup.py方式对项目进行打包,上传到https://pypi.org/ 上,然后通过easy_install或者pip(比easy_install更有好更高级)连接远程pipy,通过简单的pip install xxxx 就可以快乐的进行在线安装了。是不是很easy。

    然后,我们再看看rpm是什么?

        RPM是由红帽公司开发的软件包管理( Red Hat Package Manager)的缩写,在redhat系列的操作系统中使用rpm可以方便的进行软件的安装、查询、卸载、升级等工作。

喔,原来rpm就是redhat 搞出来一个在自己系统中方便安装软件的管理规范。也就是说,我们按照他的方式,将软件打包成rpm的格式,就可以很方便的进行安装了。我们现在的目标就是要将自己写的项目打包成rpm包,方便安装。

    那么如何将软件打包成rpm的格式呢?不要急,rpm提供了一个构建rpm的工具叫做rpm-build,可以通过yum 安装rpm-build直接使用 。通过rpmbuild 就可以把一个源码包打包成rpm格式的安装包。rpm的使用我们这里不作为重点来讲,感兴趣的可以参考这里,或者自行查阅。rpmbuild 打包时需要一个spec文件,而这个文件就是整个打包的核心,打包时按照这个spec文件作为规范,进行打包。这个spec文件不太好写,有很多语法和宏的概念,我们这里就主要研究下这个spec文件。

    作为程序员和技术人员,我们一定要对得起前人的作出的贡献,要有借鉴的思维,也就是说,我们只有站在巨人的肩膀上,才能尿巨人一身。(偷笑)

因此,我找了openstack社区相似的项目manila-ui,这个项目也是为了将文件共享相关的界面通过插件的方式集成进dashboard中。而且,manila-ui也实现了rpm制作和分发。因此,我们就结合manila-ui的spec 文件来学习如何编写自己的spec文件,实现项目的打包。

好了,我们先看下项目结构:

manila-ui-2.1.0
 ├── AUTHORS
 ├── babel.cfg
 ├── ChangeLog
 ├── CONTRIBUTING.rst
 ├── doc
 ├── HACKING.rst
 ├── LICENSE
 ├── manage.py
 ├── manila_ui
 ├── manila_ui.egg-info
 ├── PKG-INFO
 ├── README.rst
 ├── requirements.txt
 ├── run_tests.sh
 ├── setup.cfg
 ├── setup.py
 ├── test-requirements.txt
 ├── tools


 

来看manila-ui项目的这两个文件:

setup.cfg

[metadata]
name = manila-ui
summary = Manila Management Dashboard
description-file = 
	README.rst
author = OpenStack
author-email = openstack-dev@lists.openstack.org
home-page = http://www.openstack.org/
classifier = 
	Environment :: OpenStack
	Intended Audience :: Information Technology
	Intended Audience :: System Administrators
	License :: OSI Approved :: Apache Software License
	Operating System :: POSIX :: Linux
	Programming Language :: Python
	Programming Language :: Python :: 2
	Programming Language :: Python :: 2.7
	Programming Language :: Python :: 3
	Programming Language :: Python :: 3.4

[files]
packages = 
	manila_ui

[build_sphinx]
source-dir = doc/source
build-dir = doc/build
all_files = 1

[upload_sphinx]
upload-dir = doc/build/html

[compile_catalog]
directory = manila_ui/locale
domain = manila-ui

[update_catalog]
domain = manila-ui
output_dir = manila_ui/locale
input_file = manila_ui/locale/manila-ui.pot

[extract_messages]
keywords = _ gettext ngettext l_ lazy_gettext
mapping_file = babel.cfg
output_file = manila_ui/locale/manila-ui.pot

[egg_info]
tag_date = 0
tag_svn_revision = 0
tag_build =

setup.py

try:
    import multiprocessing  # noqa
except ImportError:
    pass

setuptools.setup(
    setup_requires=['pbr>=1.8'],
    pbr=True)

未完待续。。。