美文网首页
Bazel构建基础

Bazel构建基础

作者: 胡修波 | 来源:发表于2017-08-03 20:16 被阅读0次

一、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目标程序:

相关文章

  • Bazel构建基础

    一、Bazel是什么 Bazel是一个构建工具,即一个可以运行编译和测试来组装软件的工具,跟Make、Ant、Gr...

  • C++20 以 Bazel & Clang 开始

    C++20 如何以 Bazel & Clang 进行构建呢? 本文将介绍: Bazel[https://bazel...

  • 使用Bazel创建iOS应用

    Bazel简介 Bazel是一个Google开源的构建和测试工具,Bazel支持多种语言的项目,并为多个平台构建输...

  • 如何学习 Bazel

    Bazel 是一个构建工具,学习 Bazel 要从以下三个方面入手 Bazel 的设计目的 Bazel 的技术实现...

  • 02-bazel构建 C++ 项目(一)

    在上一篇的基础之上开始学习如何用 bazel 构建一个简单的c++ 项目,也会深入了解一些 bazel 中的概念 ...

  • iOS项目自定义构建脱离xcode

    小破站的构建系统 https://tulsi.bazel.build/[https://tulsi.bazel.b...

  • 风格迁移模型压缩 第三期

    1 安装bazel Bazel是google推出的一款工程编译工具,并且已经将其开源。 Bazel可以快速地构建可...

  • Bazel Build:Bazel是一把双刃剑

    Bazel是一个支持多语言、跨平台的构建工具。Bazel支持任意大小的构建目标,并支持跨多个仓库的构建,是Goog...

  • Bazel构建

    简介 Bazel是一个类似于Make,Maven和Gradle的开源构建和测试工具。Bazel支持多种语言混编的项...

  • Golang项目Bazel指北

    该文档主要介绍 Bazel 构建基本 golang 项目的案例, 主要了解在golang项目中如何使用bazel....

网友评论

      本文标题:Bazel构建基础

      本文链接:https://www.haomeiwen.com/subject/vbxmlxtx.html