1. 程式人生 > >OpenStack基礎知識-打包知識點(1)

OpenStack基礎知識-打包知識點(1)

後來 inpu != copyright 說明 onf site 包含 mod

OpenStack是使用setuptools工具來進行打包,不過為了滿足OpenStack項目的需求,引入了一個輔助工具pbr來配合setuptools完成打包工作。
pbr (Python Build Reasonableness)
pbr是一個setuptools的擴展工具,被開發出來的主要目的是為了方便使用setuptools,其項目文檔地址在OpenStack官網內:http://docs.openstack.org/developer/pbr/。
pbr使用方式

import setuptools
setuptools.setup(setup_requires=[‘pbr‘], pbr=True)
按照上面的方式就可以配置setuptools工具使用pbr來協助完成打包工作。這裏setup_requires參數是setup函數在執行之前需要依賴的包的列表。這裏依賴的包的功能可以理解為生成setup的實際參數。你可以看到,當使用pbr的時候,setup函數只有兩個參數,然而實際上setuptools.setup函數實際上是disutils.core.setup函數,會接收任何參數,這些參數可以通過在調用時指定,也可以通過所依賴的擴展來生成(比如pbr)。

OpenStack社區為啥要開發pbr呢?
因為setuptools庫使用起來還是有點麻煩,參數太多,而且直接通過指定setup函數參數的方法實在太不方便了。pbr就是為了方便而生的,它帶了了如下的改進:
1.使用setup.cfg文件來提供包的元數據。這個是從disutils2學來的。
2.基於requirements.txt文件來實現自動依賴安裝。requirements.txt文件中包含了一個項目所要依賴的庫,這個文件的格式是和pip兼容的。
3.利用Sphinx實現文檔自動化。
4.基於git history自動生成AUTHORS和ChangeLog文件。
5.針對git自動創建文件列表。
6.基於git tags的版本號管理。

setup.cfg和requirements.txt
setup.cfg
由於OpenStack項目都使用了setuptools和pbr來執行打包工作,因此項目的元數據都放在setup.cfg文件中。我們以keystone項目的setup.cfg文件為例來說明這個文件裏一般會包含什麽內容

[update_catalog]
domain = keystone
output_dir = keystone/locale
input_file = keystone/locale/keystone.pot

[extract_messages]
keywords = _ gettext ngettext l_ lazy_gettext
mapping_file = babel.cfg
output_file = keystone/locale/keystone.pot
copyright_holder = OpenStack Foundation
msgid_bugs_address = https://bugs.launchpad.net/keystone

NOTE(dstanek): Uncomment the [pbr] section below and remove the ext.apidoc

Sphinx extension when https://launchpad.net/bugs/1260495 is fixed.

[pbr] # pbr本身的配置
warnerrors = True
autodoc_tree_index_modules = True

[entry_points] # 指定入口點
console_scripts = # 指定要生成的可執行文件
keystone-all = keystone.cmd.all:main
keystone-manage = keystone.cmd.manage:main

下面是其他entry_points內容,主要用於指定不同功能的擴展,和打包無關

classifier這個參數是用來指定一個軟件包的分類、許可證、允許運行的操作系統、允許運行的Python的版本的信息。這些信息是在一個叫trove的項目。關於Python和trove的關系,請參考http://stackoverflow.com/questions/9094220/trove-classifiers-definition。
你可以在PyPI上找到完整的classifier值列表,地址是:https://pypi.python.org/pypi?%3Aaction=list_classifiers。另外,你也可以通過setuptools的命令來獲取這個列表,在項目根目錄下執行:python setup.py register --list-classifiers。

requirements.txt
這個文件指定了一個項目依賴的包有哪些,並且支出了依賴的包的版本需求,keystone項目的requirements.txt:

The order of packages is significant, because pip processes them in the order

of appearance. Changing the order has an impact on the overall integration

process, which may cause wedges in the gate later.

pbr<2.0,>=0.11
WebOb>=1.2.3
eventlet>=0.17.4
greenlet>=0.3.2
PasteDeploy>=1.5.0
Paste
Routes!=2.0,>=1.12.3
cryptography>=0.8.2 # Apache-2.0
six>=1.9.0
SQLAlchemy<1.1.0,>=0.9.7
sqlalchemy-migrate>=0.9.6
stevedore>=1.5.0 # Apache-2.0
passlib
python-keystoneclient>=1.6.0
keystonemiddleware>=1.5.0
oslo.concurrency>=2.1.0 # Apache-2.0
oslo.config>=1.11.0 # Apache-2.0
oslo.messaging!=1.12.0,>=1.8.0 # Apache-2.0
oslo.db>=1.10.0 # Apache-2.0
oslo.i18n>=1.5.0 # Apache-2.0
oslo.log>=1.2.0 # Apache-2.0
oslo.middleware!=2.0.0,>=1.2.0 # Apache-2.0
oslo.policy>=0.5.0 # Apache-2.0
oslo.serialization>=1.4.0 # Apache-2.0
oslo.service>=0.1.0 # Apache-2.0
oslo.utils>=1.6.0 # Apache-2.0
oauthlib>=0.6
pysaml2>=2.4.0
dogpile.cache>=0.5.3
jsonschema!=2.5.0,<3.0.0,>=2.0.0
pycadf>=0.8.0
msgpack-python>=0.4.0

軟件包歸檔格式
Python的軟件包一開始是沒有官方的標準分發格式的。比如Java有jar包或者war包作為分發格式,Python則什麽都沒有。後來不同的工具都開始引入一些比較通用的歸檔格式。比如,setuptools引入了Egg格式。但是,這些都不是官方支持的,存在元數據和包結構彼此不兼容的問題。因此,為了解決這個問題,PEP 427定義了新的分發包標準,名為Wheel。目前pip和setuptools工具都支持Wheel格式。這裏我們簡單總結一下常用的分發格式:

?tar.gz格式:這個就是標準壓縮格式,裏面包含了項目元數據和代碼,可以使用python setup.py sdist命令生成。
?.egg格式:這個本質上也是一個壓縮文件,只是擴展名換了,裏面也包含了項目元數據以及源代碼。這個格式由setuptools項目引入。可以通過命令python setup.py bdist_egg命令生成。
?.whl格式:這個是Wheel包,也是一個壓縮文件,只是擴展名換了,裏面也包含了項目元數據和代碼,還支持免安裝直接運行。whl分發包內的元數據和egg包是有些不同的。這個格式是由PEP 427引入的。可以通過命令python setup.py bdist_wheel生成。

.egg-info和.dist-info目錄
如果你到系統中安裝Python庫的路徑下看看,就能看到很多名稱以.egg-info或者以.dist-info結尾的目錄。這些目錄的內容就是這個庫的元數據,是從庫的分發包中拷貝出來的。其中.egg-info類型的目錄來自於Egg格式的分發包,.dist-info類型的目錄來自於Wheel格式的分發包。

軟件包的安裝
安裝工具
上面已經提到了,setuptools項目提供了一個軟件包安裝工具esay_install。easy_install支持從軟件歸檔文件中或者從PyPI上安裝軟件包,不過這個工具並不好用,比如缺少卸載功能等,因此並不流行,現在更多的都是使用pip工具。
pip項目提供了很好的軟件包安裝方式,並且已經被包含到Python 3.4中,可以從PyPI、tarball或者Wheel歸檔中安裝和卸載軟件按包。
關於pip常見的用法(pip install, pip uninstall, pip search, ...)。

安裝路徑
軟件包的安裝路徑依賴於操作系統、Python版本和安裝方式。
在Debian系的系統上(比如Ubuntu)
使用apt-get install從系統軟件源安裝
Python 2.7: /usr/lib/python2.7/dist-packages
Python 3.4: /usr/lib/python3.4/dist-packages

使用pip install命令安裝
Python 2.7: /usr/local/lib/python2.7/dist-packages
Python 3.4: /usr/local/lib/python3.4/dist-packages

在virtualenv中使用pip install安裝
Python 2.7: lib/python2.7/site-packages
Python 3.4: lib/python3.4/site-packages

在CentOS系的系統上

使用yum install命令安裝

Python 2.7: /usr/lib/python2.7/site-packages

以開發模式安裝
pip的安裝命令可以使用-e選項,用來從本地代碼目錄或者版本庫URL來安裝一個開發版本的庫。采用這種方式的時候,在安裝目錄下只會創建一個包含軟件包信息的文件,真正的代碼不會安裝到系統目錄下。

OpenStack基礎知識-打包知識點(1)