來到了新公司上班,首先就是得把本身的環境給搭起來。知乎使用了buildout做爲python項目的構建工具。html
那麼什麼是 buildout ?python
buildout的是一款自動化構建工具。
由Zope
團隊開發維護。包名爲zc.buildout
。session
buildout
能夠爲應用構建獨立的依賴環境。相似於virtualenv
,但兩者還有不一樣。
粗略地講,buildout
支持的功能更多更便於自動化並且具體定位有所不一樣。app
首先咱們創建一個 python 獨立環境的沙盒,不論是 virtualenv 仍是 miniconda 都行。配置好沙盒以後安裝 buildout :工具
pip install zc.buildout
建立一個配置文件 buildout.cfg。配置文件是整個構建過程的核心,這裏我直接上一個比較全的配置挨個說明字段含義 :ui
[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裏面的描述和寫法,這裏只是提一下。this
[buildout]: 這是一個必須的 session 塊。url
develop: 用來管理開發庫的一個東西,通常不須要配置。這裏配置`.` 符號,在執行 buildout 命令的時候生成的 develop-eggs 文件夾將會是一個空的。spa
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官方文檔