Python 打包的小工具 - Beeper

需求

  1. 需要将项目打包, 有足够的手段打断点排查(例如修改代码)
  2. 需要提前准备好Virtualenv环境
  3. 最好可以提供一些定制的接口, 例如提前将静态资源构建

备选方案

Platter

Platter 是一个打包工具,工具链是 pip, virtualenv, wheel. 特性是服务器在飞机上也能很快安装好(离线)。 使用上 先 build 项目为 tar, 再解压执行 ./install.sh

tar 包含有项目 wheel 和项目依赖 bundle wheel, install.sh 会新建venv环境并安装这些 wheel.

Platter 能定制化,构建前后有钩子可以执行脚本。有 fabric 的模板代码

Pex

pex 将项目打包成一个可执行文件形式的命令行工具(一个zip文件,其中包含 main.py), 遵照 PEP 441 规范。 部署流程用 scp 就能搞定。构建 pex 的命令行工具需要指定项目依赖,console script, 以及目标文件。

pex 比较适用发布命令行工具.

FPM

FPM 是一个打包工具,可以将构建好的目标目录打好包(例如 zip, tar, deb, rpm, etc..) 将构建流程与打包分离开来。

选择的方案

  • Platter 最大的问题是现在貌似停止了维护,这将导致一些隐患(armin似乎就没有上传到pypi去)。除此之外是个很有吸引力的方案
  • pex 不满足需求 1。虽然还蛮推崇不可变部署的宗旨,但能留个后门的手段感觉总是好的
  • FPM 不涉及构建部分。另外好几个包都运行失败了,根据它的宗旨,它现在有很多 BUG(可能是我使用姿势不太对)。

没有调研更多的方案,但我觉得这个流程并不难实现,快速做了个原型,现在看起来运行地很好。#真的不是造轮子,只是个土脚本而已#

Beeper

Beeper Github Repo

工作原理

它抽象了我们公司一些项目的构建流程。

它参考了 Platter 的主流程,但将 wheel 的部分改造成了直接将 venv 的目录打进去。

它运行了如下指令:

  • rm -rf venv/ dist/
  • mkdir -p dist/
  • mkdir -p ./venv
  • virtualenv --distribute ./venv
  • ./venv/bin/pip install -U pip
  • ./venv/bin/pip install -r requirements.txt
  • curl VENV_TOOLS_URL -o venv/bin/virtualenv-tools
  • chmod +x venv/bin/virtualenv-tools
  • write a install.sh, it will run virtualenv-tools to relocate venv dir.
  • run some custom scripts
  • tar -cf dist/$application-$version.tar $package_files
  • rm -rf venv

如此,一次部署流程可以简化为

  • scp dist/$application-$version.tar [email protected]:/src/application/$version/
  • ssh [email protected] bash -c 'cd /src/application/$version; tar xf $application-$version.tar; ./install.sh'

执行一次 scp + tar + install, 整个环境将项目就能处于可用状态。

通过读取配置文件 beeper.yml, 完成开头的一些需求:

  • 需求1: manifest 选项要包含进去的文件列表;
  • 需求2: scripts 选项能指定一些用于打包的项目自定义的构建代码; postinstall 选项能指定一些用于安装阶段运行的代码;
  • 需求3: 默认将 venv 包含在文件列表中.

还有甚么?

  • 需要进一步学习打包的知识, 虽然没有怎么运行成功 fpm, :(, fpm 的文档好匮乏???!
  • 构建工具还有什么好用的么?