Python 构建工具 zc.buildout

2019-04-15  本文已影响0人  RoyTien

Reproduced from:

Introduction

Buildout 是一个基于 Python 的自动化构建工具,由 Zope 团队开发维护,包名为 zc.buildout。

Buildout 主要是为了解决两个问题:

通过配置文件 buildout.cfg,可以从多个部分创建,组装,并部署你的应用,能够构建一个封闭隔离的开发环境。(封闭隔离的特性类似于 virtualenv,但二者不同,Buildout 支持的功能更便于自动化构建。)(即使应用包含了非 Python 的组建,Buildout 也能胜任。)

Install

pip3 install zc.buildout

Initialization

创建一个项目目录后,在项目目录中,使用 Buildout 初始化:

buildout init

使用 tree 查看 buildout 后的目录结构:创建了目录 binpartseggsdevelop-eggs,在 bin 目录下生成了 buildout 脚本。

buildout 后的目录结构
├── bin
│   └── buildout
├── buildout.cfg
├── develop-eggs
│   ├── zc.buildout.egg-link
├── eggs
└── parts

Configuration

配置 buildout.cfg 文件

[buildout] # 脚本入口
develop = .
# index = 
newest = false
update-versions-file = versions.cfg
extends = versions.cfg
relative-paths = true
show-picked-versions = true  # 显示所安装的版本
versions = versions
parts = app
  test
  gen-thrift

[app] # 编写子函数app的逻辑
recipe = zc.recipe.egg  # 除了 recipe 其他都是选项都被认为是 recipe 的参数
interpreter = python
eggs =  pandas #需要安装的依赖
  ipython
extra-paths = ${buildout:directory}/gen-py

[test]
recipe = pbp.recipe.noserunner
eggs = ${app:eggs}
       coverage
       boring
defaults = -vd --with-coverage --with-xunit --cover-xml --cover-package=my_project --boring
extra-paths = ${buildout:directory}/gen-py

配置使用的是 INI file format。

Buildout

buildout 的流程,先调用 [buildout],然后发现 parts 中的 app 这个子函数逻辑,app 中除了 recipe,其他都被认为是 recipe 的参数,当调用 eggs 时,buildout 发现这些包没有被安装,于是自动安装包并存放在 eggs 目录下。

Buildout With setup.py

将 setup.py 中填写的 name 项对应的值,填写到 eggs 中,在 buildout 时会自动加载 setup.py 中的配置。

Create setup.py

setup.py 中填写的 name 项对应的值,填写的 eggs 中,则在 buildout 时会自动加载 setup.py 中的配置。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

fromsetuptoolsimportsetup, find_packages
 
setup(
    name='credit',  # 此处填写包名
    version='0.0.1',
    author='Roy Tien',
    author_email='xxx@gmail.com',
    description='This is just a test',
    license='PRIVATE',
    keyword='credit',
    packages=find_packages('apps'),
    install_requires=[
        'redis',  # 此处填写需要的包
        'arrow',
    ],
)

更新 buildout.cfg 文件

[buildout]
develop = .
show-picked-versions = true
parts = app

[app]
recipe = zc.recipe.egg
interpreter = python
eggs = ipython
    credit

再次执行 buildout,会解析 setup.py 的数据,并安装 install_requires 中填写的所有包,并且会通过 packages=find_packages 将目前目录加入到 sys.path

之后需要使用当前目录 bin 下的可执行文件 python 来运行代码 bin/python show_path.py

# show_path.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

if__name__ =='__main__':
    print(sys.path)

通过运行结果可以看到:

  1. 首先会搜索当前目录下的包(使用当前路径下的解释钱,自然排在最前面);
  2. 然后会搜索 eggs 目录下由 buildout 安装的包,这就是 buildout 的作用:优先加载当前目录 eggs 下的包(当前路径的包排在前面);
  3. 最后会搜索系统中的包,可以看到并没有完全隔离系统中的包

开发环境 + 生产环境

可以创建多个配置文件,将 prod.cfg 作为生产环境的配置,将 dev.cfg 作为开发环境的配置,使用 extends 来区分。

[buildout] 
extends = dev.cfg 

开发环境 VS 生产环境
我们可以创建多个配置文件, 比如把buildout.cfg作为生产环境的配置, 把develop的配置从buildout.cfg删除, 创建一个development.cfg作为开发环境的配置:

完全隔离的开发环境

工具:

创建完全隔离的开发环境

上一篇 下一篇

猜你喜欢

热点阅读