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


來到了新公司上班,首先就是得把自己的環境給搭起來。知乎使用了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

這里注意一下變量替代
${} 這個語法
${:command} 這個代表的是當前應用下的command里面的值
${app:eggs} 這個代表的是app應用下eggs的值

 

可以看到,配置使用的是 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官方文檔

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM