一、Bazel是什么
Bazel是一个构建工具,即一个可以运行编译和测试来组装软件的工具,跟Make、Ant、Gradle、Buck、Pants和Maven一样。
二、优点
1、多语言支持:
Bazel支持Java,Objective-C和C++,可以扩展来支持任意的编程语言
2、高级别的构建语言
工程是通过BUILD语言来描述的,BUILD语言以简洁的文本格式,描述了由多个小的互相关联的库、二进制程序和测试程序来组成的一个项目。而与之相比,Make这类的工具需要描述各个单独的文件和编译的命令
3、多平台支持
同一套工具和同样的BUILD文件可以用来构建不同架构和不同平台的软件.
目前,在Linux和MacOS上。移植到其他Unix平台上是很简单的,提供的JDK是可用的。
三、概念
workspace 工作空间
每个工作空间中由一个WORKSPACE文件,来描述工作空间所使用到的信息
package 程序包
每个程序包中包含一个BUILD文件,此文件中描述了此工具包的生成构建方式。
target 目标
生成的目标,每个target又可以作为另外一个规则的输入
四、Bazel入门demo
第一步 创建一个项目demo-project:
Linux or mac os命令行输入:
mkdir demo_project
第二步 创建一个空的工作区配置文件:WORKSPACE
用于表示这是Bazel项目对应的根目录。
第三步 创建Java项目
cd demo-project
mkdir -p src/main/java/com/demo
第四步 ,创建java源文件
vi src/main/java/com/demo/DemoRunner.java, 源文件代码
package com.demo;
public class DemoRunner {
public static void main(String args[]) {
Hello.hello();
}
}
vi src/main/java/com/demo/Hello.java, 源文件代码
package com.demo;
public class Hello {
public static void hello() {
System.out.println("hello,world");
}
}
第五步:创建构建文件BUILD,用于构建项目信息
在demo-project目录下创建BUILD文件,构建内容为:
# ~/demo-project/BUILD
java_binary(
name = "hello",
srcs = glob(["**/*.java"]),
main_class = "com.demo.DemoRunner",
)
单行注解:#
java_binary 是一个构建规则。
其中 name 对应一个构建目标的标识符,可用用它来向Bazel指定构建哪个项目。
srcs 对应一个源文件列表,Bazel需要将这些源文件编译为二进制文件。其中 glob(["*/.java"]) 表示递归包含每个子目录中以每个 .java 为后缀名的文件。com.demo.DemoRunner 指定包含main方法的类。
第六步,开始构建
bazel build //:hello
ok,so easy,第一个项目构建成功了
说说bazel中的依赖关系
一个项目拆分为两个部分独立构建,同时设置它们之间的依赖关系,以上两个文件,修改一下:
java_binary(
name = "hello",
srcs = ["src/main/java/com/demo/DemoRunner.java"],
main_class = "com.demo.DemoRunner",
deps = [":Hello"],
)
java_library(
name = "HelloTest",
srcs = ["src/main/java/com/demo/Hello.java"],
)
虽然源文件是一样的,但是现在Bazel将采用不同的方式来构建:首先是构建 HelloTest库,然后是构建 hello
多包构建(packages)
对于更大的项目,我们通常需要将它们拆分到多个目录中。你可以用类似//path/to/directory:target-name的名字引用在其他BUILD文件定义的目标。假设src/main/java/com/demo/有一个sub/子目录,包含下面的文件
mkdir -p src/main/java/com/demo/sub
创建源文件:
vi src/main/java/com/demo/sub/SubTest.java
package com.demo.sub;
import com.demo.Hello;
public class SubTest {
public static void main(String args[]) {
Hello.hello();
}
}
SubTest依赖com.demo.Hello,因此我们需要在src/main/java/com/demo/sub/BUILD构建文件中添加相应的依赖规则:
~/gitroot/my-project/src/main/java/com/demo/sub/BUILD
java_binary(
name = "sub-test",
srcs = ["SubTest.java"],
main_class = "com.demo.sub.SubTest",
deps = ["//:Hello"]
)
然而,默认情况下构建目标都是 私有 的。也就是说,我们只能在同一个BUILD文件中被引用。这可以避免将很多实现的细节暴漏给公共的接口,但是也意味着我们需要手工允许sub-test所依赖的//:Hello目标
可用通过在BUILD文件增加visibility = level属性来改变目标的可间范围。下面是通过在~/demo-project/BUILD文件增加可见规则,来改变Hello目标的可见范围
java_library(
name = "Hello",
srcs = ["src/main/java/com/demo/Hello.java"],
visibility = ["//src/main/java/com/demo/sub:__pkg__"],
)
这个规则表示//:greeter目标对于//src/main/java/com/demo/sub包是可见的。现在我们可以重新构建sub-test目标程序:
网友评论