一. 背景
之前的一篇博客介紹了使用騰訊開(kāi)源編譯工具blade構(gòu)建系統(tǒng)的內(nèi)容 [使用BLADE構(gòu)建c++工程管理], 最后提到了balde其實(shí)源于google的Bazel跨释。最近google開(kāi)源的深度學(xué)習(xí)的框架Tensorflow也是使用該工具構(gòu)建嚎京。本文會(huì)給出示例,展示如何使用bazel來(lái)維護(hù)較為復(fù)雜的系統(tǒng)的編譯
二. 安裝
bazel只支持linux和mac os系統(tǒng)。并且需要JDK 8缝其。下載installer砾省,執(zhí)行如下命令即可
$ chmod +x install-version-os.sh
$ ./install-version-os.sh --user
bazel工具的原理
bazel跟docker類(lèi)似也采用了CS的架構(gòu)把跨,bazel命令作為客戶(hù)端啟動(dòng)編譯的時(shí)候會(huì)啟動(dòng)一個(gè)java的服務(wù)進(jìn)程用來(lái)做真正的編譯任務(wù)终娃。
這樣做的好處是更好的全局調(diào)度和復(fù)用中間結(jié)果(BUILD,DAG依賴(lài)分析)延都。
三. 示例
bazel和blade使用方式十分類(lèi)似雷猪,只是在功能上更加的完整睛竣,支持更多的語(yǔ)言
- 一個(gè)有簡(jiǎn)單依賴(lài)的java后端服務(wù)WORKSPACE
說(shuō)明
在工程的根目錄需要一個(gè)文件WORKSPACE晰房,里面可以是空,也可以配置整個(gè)工程的配置和對(duì)外的依賴(lài)射沟。注意子目錄中殊者,每個(gè)package需要有一個(gè)BUILD
說(shuō)明
java_library定義了一個(gè)java的庫(kù),會(huì)產(chǎn)出一個(gè)jar文件供其他模塊調(diào)用, *_library會(huì)默認(rèn)使用對(duì)應(yīng)的build rule
name:產(chǎn)出的目標(biāo)庫(kù)的名稱(chēng)
srcs: 功能代碼
visibility:這個(gè)選項(xiàng)控制了這個(gè)庫(kù)的使用權(quán)限驗(yàn)證验夯,這里規(guī)定了只有這個(gè)目錄/src/main/java/com/example/cmdline下面的代碼才能訪問(wèn)本lib
- tensorflow中的一個(gè)工程
說(shuō)明
new_http_archive等以new_*開(kāi)頭的表示依賴(lài)外部不適用bazel來(lái)管理的工程猖吴。對(duì)應(yīng)的http_archive表示以bazel的工程。
bind表示依賴(lài)的別名
如果不是用bind挥转,那么本工程要想依賴(lài)external的格式是: @coworkers-project//:some-lib
使用這個(gè)命令可以拉取全部的external依賴(lài)
bazel fetch //...
說(shuō)明
package:定義了包對(duì)于整個(gè)子目錄都可見(jiàn)
sh_binary:將可執(zhí)行的sh文件集合打包
py_library:打包可執(zhí)行的python文件集合
filegroup:打包其他的資源性文件
四. 支持更多的語(yǔ)言
說(shuō)明
這里面包括了流行的服務(wù)器端語(yǔ)言c++,java,go,py等等海蔽。也包含了對(duì)android和ios工程的支持共屈,十分全面。