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="[email protected]",
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 = [email protected]
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)
未完待续。。。
https://www.cnblogs.com/goldsunshine/p/8872623.html
https://lingxiankong.github.io/2013-12-23-python-setup.html