1. 程式人生 > >Python 構建工具 buildout 的介紹與使用

Python 構建工具 buildout 的介紹與使用

gunicorn tool 執行 參考 目的 bsp 速度 extend .cn

來到了新公司上班,首先就是得把自己的環境給搭起來。知乎使用了buildout作為python項目的構建工具。

那麽什麽是 buildout ?

buildout的是一款自動化構建工具。
Zope團隊開發維護。包名為zc.buildout

buildout可以為應用構建獨立的依賴環境。類似於virtualenv,但二者還有不同。
粗略地講,buildout支持的功能更多更便於自動化而且具體定位有所不同。

首先我們建立一個 python 獨立環境的沙盒,不管是 virtualenv 還是 miniconda 都行。配置好沙盒之後安裝 buildout :

pip install zc.buildout

創建一個配置文件 buildout.cfg。配置文件是整個構建過程的核心,這裏我直接上一個比較全的配置挨個說明字段含義 :

[buildout]
develop = .
index = mirror地址
newest = false
update-versions-file = versions.cfg
extends = versions.cfg
relative-paths = true
show-picked-versions = true
versions = versions
parts = app
        test
        gen-thrift

[app]
recipe 
= zc.recipe.egg interpreter = python eggs = zticket gunicorn setuptools tzone.cli ipython miller2 flake8 extra-paths = ${buildout:directory}/gen-py [gen-thrift] recipe = plone.recipe.command command = 我可以隨便使用一個命令 update-command = ${:command} [test] recipe = pbp.recipe.noserunner eggs
= ${app:eggs} coverage boring mock defaults = -vd --with-coverage --with-xunit --cover-xml --cover-package=zticket --boring extra-paths = ${buildout:directory}/gen-py

可以看到,配置使用的是 INI FILE 語法,詳情可以查看refer裏面的描述和寫法,這裏只是提一下。

[buildout]: 這是一個必須的 session 塊。

develop: 用來管理開發庫的一個東西,一般不需要配置。這裏配置`.` 符號,在執行 buildout 命令的時候生成的 develop-eggs 文件夾將會是一個空的。

newest: 這個參數默認是 true,如果是 true,那麽會在 buildout 的時候總是檢查最新版本,如果為 false 只有在包不滿足需求的時候才會去更新版本。

update-versions-file: 指定一個包依賴的更新文件。一般使用 versions.cfg 來保存需要的依賴。

extended: 擴展配置的指定。

relative-path: 啟用相對路徑。

show-picked-versions: 這個字段默認是 false 的,如果是 true,當 buildout 在找到一個最新的發布版而且滿足 requirement 申明的時候,將會重新寫一條配置進versions.cfg文件裏,也就是說 update-versions-file 配置的文件中。類似於這種格式:

# Required by:
# opentracing==1.0rc3
futures = 3.0.5

versions: 默認就是 versions 更詳細可以參考這裏。http://docs.buildout.org/en/latest/getting-started.html#pinned-versions。

到這裏為止,buildout 的基礎配置就結束了。下面的每個 section 可以理解為一個另外的app。由上面配置的 parts 申明的 app section 名字。

下面介紹各 parts 裏面申明的塊裏面都做了什麽。

app section 下面:

recipes: 首先每個塊裏面都必須包含一個 recipe 的項目,這個項目用來神明自己使用了什麽工具。各種其他的包在 pypi 上都能下載到,各有不同的用處。也許這裏可以將它理解成可以使用不同的插件。最常使用的是 zc.recipe.egg 這個 recipe 了,他可以被用來安裝各種各樣的包,並且打包成 egg 。

interpreter: 會創建一個包含eggs和依賴關系的環境在bin目錄下面。

eggs: 是一個list被用來安裝一個或者多個setuptools的依賴eggs。

extra-paths: 這個可以理解成,需要編譯出應用之後應該被加入sys.path的路徑。

gen-thrift section 下面:

使用了一個 plone.recipe.command 的 recipe,這個 recipe 的功能參見 https://pypi.python.org/pypi/plone.recipe.command?,簡單來說就是一個可以提供在 build 的時候執行一個命令。

command: 在 build 的時候需要執行的命令。

update-command: 在 build 更新的時候需要執行的命令。

test section 下面:

使用的 recipe pbp.recipe.noserunner 查看 https://pypi.python.org/pypi/pbp.recipe.noserunner/0.2.6。

eggs: 和上面的建立依賴包相似,指定相關 eggs 。

default: 指定一個testrunner的默認選項。

extra-paths: 同樣為應用中增加相關 sys.path。

在配置好相關設置之後,就可以開始愉快 build 了。build 之後可以發現,所有依賴包都被安裝進了文件夾 eggs 中。just like this:

技術分享圖片

如果你足夠仔細,可以發現這些都是文件夾。但是sys.path裏面直接add他們的路徑,就可以直接 import 他們。

sys.path like this:

技術分享圖片

可以看到 buildout 幫助我們完成了一個封閉環境並且自動實現包管理。有點 pip+virtualenv/conda 的感覺。而且這個環境可以在編譯完成之後任意在同樣 python 解釋器環境下移動。

另外提一點,在下載環境的時候速度也比較重要,我們可以重新設置全局 pip 和 easy_install 源,來加速包安裝。

通過環境變量修改:

export PIP_INDEX_URL=https://mirror.in.zhihu.com/simple

通過配置文件修改:

~/.pip/pip.conf
[global]
extra-index-url = mirror

~/.pydistutils.cfg
[easy_install]
index_url = mirror

另外,其他的想到之後再補充,以上。

Reference:

http://yabin.me/2017/07/25/buildout構建工具/ buildout構建工具

https://www-archive.mozilla.org/projects/cck/docs/WizardMachine/syntax.html INI file syntax

http://docs.buildout.org/en/latest/reference.html buildout官方文檔

Python 構建工具 buildout 的介紹與使用