• Python 构建工具 buildout 的介绍与使用


    来到了新公司上班,首先就是得把自己的环境给搭起来。知乎使用了buildout作为python项目的构建工具。

    那么什么是 buildout ?

    buildout的是一款自动化构建工具。
    Zope团队开发维护。包名为zc.buildout

    buildout可以为应用构建独立的依赖环境。类似于virtualenv,但二者还有不同。
    粗略地讲,buildout支持的功能更多更便于自动化而且具体定位有所不同。

    首先我们建立一个 python 独立环境的沙盒,不管是 virtualenv 还是 miniconda 都行。配置好沙盒之后安装 buildout :

    pip install zc.buildout

    创建一个配置文件 buildout.cfg。配置文件是整个构建过程的核心,这里我直接上一个比较全的配置挨个说明字段含义 :

    [buildout]
    develop = .
    index = mirror地址
    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]
    recipe = zc.recipe.egg
    interpreter = python
    eggs = zticket
           gunicorn
           setuptools
           tzone.cli
           ipython
           miller2
           flake8
    extra-paths = ${buildout:directory}/gen-py
    
    [gen-thrift]
    recipe = plone.recipe.command
    command = 我可以随便使用一个命令
    update-command = ${:command}
    
    [test]
    recipe = pbp.recipe.noserunner
    eggs = ${app:eggs}
           coverage
           boring
           mock
    defaults = -vd --with-coverage --with-xunit --cover-xml --cover-package=zticket --boring
    extra-paths = ${buildout:directory}/gen-py

    这里注意一下变量替代
    ${} 这个语法
    ${:command} 这个代表的是当前应用下的command里面的值
    ${app:eggs} 这个代表的是app应用下eggs的值

    可以看到,配置使用的是 INI FILE 语法,详情可以查看refer里面的描述和写法,这里只是提一下。

    [buildout]: 这是一个必须的 session 块。

    develop: 用来管理开发库的一个东西,一般不需要配置。这里配置`.` 符号,在执行 buildout 命令的时候生成的 develop-eggs 文件夹将会是一个空的。

    newest: 这个参数默认是 true,如果是 true,那么会在 buildout 的时候总是检查最新版本,如果为 false 只有在包不满足需求的时候才会去更新版本。

    update-versions-file: 指定一个包依赖的更新文件。一般使用 versions.cfg 来保存需要的依赖。

    extended: 扩展配置的指定。

    relative-path: 启用相对路径。

    show-picked-versions: 这个字段默认是 false 的,如果是 true,当 buildout 在找到一个最新的发布版而且满足 requirement 申明的时候,将会重新写一条配置进versions.cfg文件里,也就是说 update-versions-file 配置的文件中。类似于这种格式:

    # Required by:
    # opentracing==1.0rc3
    futures = 3.0.5

    versions: 默认就是 versions 更详细可以参考这里。http://docs.buildout.org/en/latest/getting-started.html#pinned-versions。

    到这里为止,buildout 的基础配置就结束了。下面的每个 section 可以理解为一个另外的app。由上面配置的 parts 申明的 app section 名字。

    下面介绍各 parts 里面申明的块里面都做了什么。

    app section 下面:

    recipes: 首先每个块里面都必须包含一个 recipe 的项目,这个项目用来神明自己使用了什么工具。各种其他的包在 pypi 上都能下载到,各有不同的用处。也许这里可以将它理解成可以使用不同的插件。最常使用的是  zc.recipe.egg 这个 recipe 了,他可以被用来安装各种各样的包,并且打包成 egg 。

    interpreter: 会创建一个包含eggs和依赖关系的环境在bin目录下面。

    eggs: 是一个list被用来安装一个或者多个setuptools的依赖eggs。

    extra-paths: 这个可以理解成,需要编译出应用之后应该被加入sys.path的路径。

    gen-thrift section 下面:

    使用了一个 plone.recipe.command 的 recipe,这个 recipe 的功能参见 https://pypi.python.org/pypi/plone.recipe.command?,简单来说就是一个可以提供在 build 的时候执行一个命令。

    command: 在 build 的时候需要执行的命令。

    update-command: 在 build 更新的时候需要执行的命令。

    test section 下面:

    使用的 recipe pbp.recipe.noserunner 查看 https://pypi.python.org/pypi/pbp.recipe.noserunner/0.2.6。

    eggs: 和上面的建立依赖包相似,指定相关 eggs 。

    default: 指定一个testrunner的默认选项。

    extra-paths: 同样为应用中增加相关 sys.path。

    在配置好相关设置之后,就可以开始愉快 build 了。build 之后可以发现,所有依赖包都被安装进了文件夹 eggs 中。just like this:

    如果你足够仔细,可以发现这些都是文件夹。但是sys.path里面直接add他们的路径,就可以直接 import 他们。

    sys.path like this: 

    可以看到 buildout 帮助我们完成了一个封闭环境并且自动实现包管理。有点 pip+virtualenv/conda 的感觉。而且这个环境可以在编译完成之后任意在同样 python 解释器环境下移动。

    另外提一点,在下载环境的时候速度也比较重要,我们可以重新设置全局 pip 和 easy_install 源,来加速包安装。

    通过环境变量修改:

    export PIP_INDEX_URL=https://mirror.in.zhihu.com/simple

    通过配置文件修改:

    ~/.pip/pip.conf
    [global]
    extra-index-url = mirror
    
    ~/.pydistutils.cfg
    [easy_install]
    index_url = mirror

    另外,其他的想到之后再补充,以上。

    Reference:

    http://yabin.me/2017/07/25/buildout构建工具/  buildout构建工具

    https://www-archive.mozilla.org/projects/cck/docs/WizardMachine/syntax.html  INI file syntax

    http://docs.buildout.org/en/latest/reference.html  buildout官方文档

  • 相关阅读:
    欧拉计划之题目7:找出第10001个质数
    DShow实现一个avi视频的播放(含有个人解释和注释)
    DirectX 9 SDK安装后在vs2010里编译BaseClasses出错问题解决方法
    C#内存占用大量资源的解决办法
    C#读写ini文件操作
    【Java】编程技术经典书籍列表
    【数据库_Mysql】查询当前年份的sql
    【数据库_Mysql】MySQL动态语句 if set choose where foreach trim
    【JavaScript】20款漂亮的css字体
    【数据库_Mysql】<foreach>标签在Mysql中的使用
  • 原文地址:https://www.cnblogs.com/piperck/p/7867060.html
Copyright © 2020-2023  润新知