使用zc.buildout構建python項目


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





免責聲明!

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



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