一. 背景
之前的一篇博客介绍了使用腾讯开源编译工具blade构建系统的内容 [使用BLADE构建c++工程管理], 最后提到了balde其实源于google的Bazel。最近google开源的深度学习的框架Tensorflow也是使用该工具构建。本文会给出示例,展示如何使用bazel来维护较为复杂的系统的编译
二. 安装
bazel只支持linux和mac os系统。并且需要JDK 8。下载installer,执行如下命令即可
$ chmod +x install-version-os.sh
$ ./install-version-os.sh --user
bazel工具的原理
bazel跟docker类似也采用了CS的架构,bazel命令作为客户端启动编译的时候会启动一个java的服务进程用来做真正的编译任务。
这样做的好处是更好的全局调度和复用中间结果(BUILD,DAG依赖分析)。
三. 示例
bazel和blade使用方式十分类似,只是在功能上更加的完整,支持更多的语言
- 一个有简单依赖的java后端服务WORKSPACE
说明
在工程的根目录需要一个文件WORKSPACE,里面可以是空,也可以配置整个工程的配置和对外的依赖。注意子目录中,每个package需要有一个BUILD
说明
java_library定义了一个java的库,会产出一个jar文件供其他模块调用, *_library会默认使用对应的build rule
name:产出的目标库的名称
srcs: 功能代码
visibility:这个选项控制了这个库的使用权限验证,这里规定了只有这个目录/src/main/java/com/example/cmdline下面的代码才能访问本lib
- tensorflow中的一个工程
说明
new_http_archive等以new_*开头的表示依赖外部不适用bazel来管理的工程。对应的http_archive表示以bazel的工程。
bind表示依赖的别名
如果不是用bind,那么本工程要想依赖external的格式是: @coworkers-project//:some-lib
使用这个命令可以拉取全部的external依赖
bazel fetch //...
说明
package:定义了包对于整个子目录都可见
sh_binary:将可执行的sh文件集合打包
py_library:打包可执行的python文件集合
filegroup:打包其他的资源性文件
四. 支持更多的语言
说明
这里面包括了流行的服务器端语言c++,java,go,py等等。也包含了对android和ios工程的支持,十分全面。