用Buildout來構建Python項目
什么是Buildout
(Remixed by Matt Hamilton, original from http://xkcd.com/303)
Buildout是一個基於Python的構建工具, 通過一個配置文件,可以從多個部分創建、組裝並部署你的應用,即使應用包含了非Python的組件,Buildout也能夠勝任. Buildout不但能夠像setuptools一樣自動更新或下載安裝依賴包,而且還能夠像virtualenv一樣,構建一個封閉隔離的開發環境.
初始化Buildout
首先我們新建一個目錄來共享Buildout配置和文件:
~/Projects$ mkdir buildout
~/Projects$ cd buildout
下載一個2.0的bootstrap.py腳本:
~/Projects/buildout$ wget http://downloads.buildout.org/2/bootstrap.py
然后創建一個Buildout的配置文件:
~/Projects/buildout$ touch buildout.cfg
運行bootstrap.py來生成Buildout相關的文件和目錄:
~/Projects/buildout$ python bootstrap.py
Creating directory '/Users/Eric/Projects/buildout/bin'.
Creating directory '/Users/Eric/Projects/buildout/parts'.
Creating directory '/Users/Eric/Projects/buildout/eggs'.
Creating directory '/Users/Eric/Projects/buildout/develop-eggs'.
Generated script '/Users/Eric/Projects/buildout/bin/buildout'.
從上面可以看出,創建了目錄bin,parts,eggs,develop-eggs,在bin目錄下生成了buildout腳本:
- bin目錄用來存放生成的腳本文件
- parts目錄存放生成的數據,大多用不上
- develop-eggs 存放指向開發目錄的鏈接文件。和buildout.cfg中develop選項相關
- eggs 是存放從網絡上下載下來的egg包。這些包一般在buildout.cfg中的egg選項里定義
把Python和Pyramid集成進來
配置Buildout
~/Projects/buildout$ vim buildout.cfg
[buildout]
# 每個buildout都要有一個parts列表,也可以為空。
# parts用來指定構建什么。如果parts中指定的段中還有parts的話,會遞歸構建。
parts = tools
[tools]
# 每一段都要指定一個recipe, recipe包含python的代碼,用來安裝這一段,
# zc.recipe.egg就是把一些把下面的egg安裝到eggs目錄中
recipe = zc.recipe.egg
# 定義python解釋器
interpreter = python
# 需要安裝的egg
eggs =
pyramid
執行buildout命令來構建一下, 這將會把Pyramid集成進來:
~/Projects/buildout$ bin/buildout
用buildout來構建項目
現在可以創建Pyramid應用了:
~/Projects/buildout$ bin/pcreate -t starter myproject
配置一下Buildout:
~/Projects/buildout$ vim buildout.cfg
[buildout]
parts =
tools
apps
develop = myproject
[tools]
recipe = zc.recipe.egg
interpreter = python
eggs =
pyramid
[apps]
recipe = zc.recipe.egg
eggs = myproject
再次運行一下buildout:
~/Projects/buildout$ bin/buildout
現在可以再buildout的環境中啟動myproject了:
~/Projects/buildout$ bin/pserve myproject/development.ini
Starting server in PID 40619.
serving on http://0.0.0.0:6543
最佳實踐/Tips
1. 固化egg的版本
把所有的版本信息寫到[versions]
里面:
extends = versions.cfg
versions = versions
show-picked-versions = true
配置中的“show-picked-versions = true
“會在運行buildout的時候把所有的版本打印出來, 把它寫到"versions.cfg"中就可以固化了:
[versions]
Chameleon = 2.11
Mako = 0.7.3
MarkupSafe = 0.15
PasteDeploy = 1.5.0
WebOb = 1.2.3
distribute = 0.6.35
repoze.lru = 0.6
translationstring = 1.1
venusian = 1.0a7
zc.buildout = 2.0.1
zc.recipe.egg = 2.0.0a3
zope.deprecation = 4.0.2
zope.interface = 4.0.5
# Required by:
# pyramid-debugtoolbar==1.0.4
Pygments = 1.6
# Required by:
# myproject==0.0
pyramid = 1.4
# Required by:
# myproject==0.0
pyramid-debugtoolbar = 1.0.4
# Required by:
# myproject==0.0
waitress = 0.8.2
2. 使用mr.developer插件來組織大型的項目, 讓開發更方便
[buildout]
...
extensions = mr.developer
…
3. 開發環境 VS 生產環境
我們可以創建多個配置文件, 比如把buildout.cfg作為生產環境的配置, 把develop的配置從buildout.cfg刪除, 創建一個development.cfg作為開發環境的配置:
[buildout]
extends = buildout.cfg
develop = myproject