python3打包工具之buildout初体验
背景
受到知乎使用buildout作为python项目的构建工具鼓舞,本文介绍和体验一下buildout打包工具。
初体验
准备工作
安装 buildout包
$ python3 -m pip install zc.buildout
cd newproject
buildout init
wget -O
快速入门
初体验中,我们在一个空的python项目中,打包上 zc.recipe.egg 和 bobo 这两个包。
编写配置文件
设置配置文件 buildout.cfg,内容如下:
[buildout]
parts = bobo
[bobo]
recipe = zc.recipe.egg
eggs = bobo
打包
运行 buildout,结果目录信息如下:
$tree -L 3
.
├── bin
│   └── bobo
├── buildout.cfg
├── develop-eggs
├── eggs
│   ├── bobo-2.4.0-py3.6.egg
│   │   ├── bobo.py
│   │   ├── boboserver.py
│   │   ├── EGG-INFO
│   │   └── __pycache__
│   ├── WebOb-1.8.6-py3.6.egg
│   │   ├── EGG-INFO
│   │   └── webob
│   └── zc.recipe.egg-2.0.7-py3.6.egg
│       ├── EGG-INFO
│       └── zc
└── parts
运行
bobo已经在bin目录下了,可以直接运行
$bin/bobo -h
自定义服务
在这个例子中,我们可以自定义服务,包括服务的启动脚本。
编写配置文件
这里增加一个zc.zdaemonrecipe服务,使用program来指定运行的脚本。
[buildout]
parts = bobo server
[bobo]
recipe = zc.recipe.egg
eggs = bobo
[server]
recipe = zc.zdaemonrecipe
program =
  ${buildout:bin-directory}/bobo
    --static /=${buildout:directory}
    --port 8200
打包
结果如下:
├── bin
│   ├── bobo
│   ├── server
│   └── zdaemon
├── buildout.cfg
├── develop-eggs
├── eggs
│   ├── WebOb-1.8.6-py3.7.egg
│   │   ├── EGG-INFO
│   │   └── webob
│   ├── ZConfig-3.5.0-py3.7.egg
│   │   ├── EGG-INFO
│   │   └── ZConfig
│   ├── bobo-2.4.0-py3.7.egg
│   │   ├── EGG-INFO
│   │   ├── __pycache__
│   │   ├── bobo.py
│   │   └── boboserver.py
│   ├── six-1.15.0-py3.7.egg
│   │   ├── EGG-INFO
│   │   └── six.py
│   ├── zc.recipe.egg-2.0.7-py3.7.egg
│   │   ├── EGG-INFO
│   │   └── zc
│   ├── zc.zdaemonrecipe-1.0.0-py3.7.egg
│   │   ├── EGG-INFO
│   │   └── zc
│   └── zdaemon-4.3-py3.7.egg
│       ├── EGG-INFO
│       └── zdaemon
└── parts
    └── server
        └── zdaemon.conf
其中多了
运行
启动服务
% bin/server start
.
daemon process started, pid=61952
结束服务
bin/server stop
.
daemon process stopped
其它
使用固定版本
[buildout]
parts = bobo server
[bobo]
recipe = zc.recipe.egg
eggs = bobo
[server]
recipe = zc.zdaemonrecipe
program =
  ${buildout:bin-directory}/bobo
    --static /=${buildout:directory}
    --port 8200
[versions]
bobo = 2.3.0
使用文件来指定版本
[buildout]
extends = versions.cfg
parts = bobo server
[bobo]
recipe = zc.recipe.egg
eggs = bobo
[server]
recipe = zc.zdaemonrecipe
program =
  ${buildout:bin-directory}/bobo
    --static /=${buildout:directory}
    --port 8200
version.cfg 文件如下:
[versions]
bobo = 2.3.0
让 buildout 来维护版本号
[buildout]
extends = versions.cfg
show-picked-versions = true
update-versions-file = versions.cfg
parts = bobo server
[bobo]
recipe = zc.recipe.egg
eggs = bobo
[server]
recipe = zc.zdaemonrecipe
program =
  ${buildout:bin-directory}/bobo
    --static /=${buildout:directory}
    --port 8200