文章目錄
- 使用zc.buildout建立項目
- buildout配置
如果你曾經是java開發人員並開始寫python,那麼你一定十分懷念maven的依賴管理和自動構建功能。你可能已經接觸過easy_install, pip, virtualenv等工具,但這些工具並不能完全解決問題。而zc.buildout恰好是你需要的答案。buildout不但能夠像setuptools一樣自動更新或下載安裝依賴包,而且還能夠像virtualenv一樣,構建一個封閉的開發環境。
zc.buildout是一個基於python的構建(build)系統,通過一個設定檔,可以從多個部分建立、組裝並部署你的應用,即使應用程式套件含了非python的組成部分,buildout也能夠勝任。
buildout最早由Zope團隊的Jim Fulton建立,後來被很多python項目和社區使用並獲得了極高的評價。比如Django的建立者Jacob Kaplan-Moss評價說,buildout是部署應用的一種非常文明的方式。另一個比較誇張的評價來自《Python For Unix and Linux》的合著者Noah Gift,由於xxx的原因(你懂的)就不翻譯了,原文如下:
"While not directly aiming to solve world peace, it perhaps will play a role in the future, as people will be less angry about application deployment and will have more time for making love and music."
使用zc.buildout建立項目
使用zc.buildout建立項目非常容易。首先安裝zc.buildout(可以使用easy_install或pip),
然後在專案檔夾中運行buildout init:
$ mkdir newproject
$ cd newproject/
$ buildout init
Creating '.../newproject/buildout.cfg'.
Creating directory '.../newproject/bin'.
Creating directory '.../newproject/parts'.
Creating directory '.../newproject/eggs'.
Creating directory '.../newproject/develop-eggs'.
Generated script '.../newproject/bin/buildout'.
其中,buildout.cfg是設定檔,類似於maven的pom檔案,而bin/buildout是build指令碼。
當共用代碼的時候,只有buildout.cfg需要加入版本控制。checkout之後,只需要運行buildout bootstrap,就可以再次產生這些檔案夾和檔案。
當然,作為一個文明人,你不必要求其他人也安裝zc.buildout,只需要下載bootstrap.py(也可以用buildout bootstrap產生)並將這個檔案也加入版本控制。這樣,其他人可以通過運行bootstrap.py產生需要的檔案。
整個過程如果出現DistributionNotFound之類的錯誤,一般是由於不乾淨的環境造成的,通過virtualenv建立全新的環境通常可以解決。
buildout配置
先看一下buildout.cfg的一個例子:
[buildout]
develop = .
parts =
xprompt
test
[xprompt]
recipe = zc.recipe.egg:scripts
eggs = xanalogica.tumbler
interpreter = xprompt
[test]
recipe = zc.recipe.testrunner
eggs = xanalogica.tumbler
buildout.cfg使用ini格式。其中[buildout]是必須的節。在本節中,可以定義:
develop = .
指定一個或多個要開發的模組,將會被build成develop-eggs下面的egg。每個develop目錄下都需要有一個setup.py檔案。
對於單個模組的應用,可以用“.”指定使用目前的目錄,對於多模組應用,可以分別指定各個模組的檔案夾。
parts =
xprompt
test
每個buildout可能需要很多個組件(part),parts指定了哪些組件需要build。如果一個組件依賴其他的組件,則被依賴的組件會被首先build。這裡面指定了兩個組件:xprompt和test。每個part中還可以用parts指定自己的子組件。
recipe = zc.recipe.egg:scripts
每個組件必須指定一個recipe,recipe定義了如何組裝該組件。zc.buildout提供了很多recipe,同時作為buildout的發源地,這裡也提供了很多recipe。你也可以開發自己的recipe。
每個recipe會定義一些參數,需要在part所在的節中指定這些參數的值。
eggs = xanalogica.tumbler
指定每個組件依賴的模組。
上面的例子中使用的zc.recipe.testrunner是一個常用的recipe,其功能是使用zope.testing.testrunner架構建立進行測試。將會對該節中指定的所有eggs進行測試。可以參考http://www.python.org/pypi/zc.recipe.testrunner 。
buildout.cfg中還可以指定很多其他的配置選項,比如通過interpreter指定python的版本,通過${section_name:param_name}引用已有的配置項等。詳細的配置說明可以看這裡。