如果你曾經是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}引用已有的配置項等。詳細的配置說明可以看這里。