展开全部

安装

安装过程请参考: http://bazel.io/docs/install.html

使用工作区(workspace)

所有的Bazel构建都是基于一个 工作区(workspace) 概念,它是文件系统中一32313133353236313431303231363533e59b9ee7ad9431333363363431个保存了全部源代码的目录,同时还将包含一些构建后的输出目录的符号链接(例如:bazel-bin和 bazel-out 等输出目录)。工作区目录可以随意放在哪里,但是工作区的根目录必须包含一个名为 WORKSPACE 的工作区配置文件。工作区配置文件可以是一个空文件,也可以包含引用外部构建输出所需的 依赖关系。

在一个工作区内,可以根据需要共享多个项目。为了简单,我们先从只有一个项目的工作区开始介绍。

先假设你已经有了一个项目,对应 ~/gitroot/my-project/ 目录。我们先创建一个空的 ~/gitroot/my-project/WORKSPACE 工作区配置文件,用于表示这是Bazel项目对应的根目录。

创建自己的Build构建文件

使用下面的命令创建一个简单的Java项目:

$ # If you're not already there, move to your workspace directory.

$ cd ~/gitroot/my-project

$ mkdir -p src/main/java/com/example

$ cat > src/main/java/com/example/ProjectRunner.java <

package com.example;

public class ProjectRunner {

public static void main(String args[]) {

Greeting.sayHi();

}

}

EOF

$ cat > src/main/java/com/example/Greeting.java <

package com.example;

public class Greeting {

public static void sayHi() {

System.out.println("Hi!");

}

}

EOF

Bazel通过工作区中所有名为 BUILD 的文件来解析需要构建的项目信息,因此,我们需要先在 ~/gitroot/my-project 目录创建一个 BUILD 构建文件。下面是BUILD构建文件的内容:

# ~/gitroot/my-project/BUILD

java_binary(

name = "my-runner",

srcs = glob(["**/*.java"]),

main_class = "com.example.ProjectRunner",

)

BUILD文件采用类似Python的语法。虽然不能包含任意的Python语法,但是BUILD文件中的每个构建规则看起来都象是一个Python函数调用,而且你也可以用 "#" 开头来添加单行注释。

java_binary 是一个构建规则。其中 name 对应一个构建目标的标识符,可用用它来向Bazel指定构建哪个项目。srcs 对应一个源文件列表,Bazel需要将这些源文件编译为二进制文件。其中 glob(["**/*.java"]) 表示递归包含每个子目录中以每个 .java 为后缀名的文件。com.example.ProjectRunner 指定包含main方法的类。

现在可以用下面的命令构建这个Java程序了:

$ cd ~/gitroot/my-project

$ bazel build //:my-runner

INFO: Found 1 target...

Target //:my-runner up-to-date:

bazel-bin/my-runner.jar

bazel-bin/my-runner

INFO: Elapsed time: 1.021s, Critical Path: 0.83s

$ bazel-bin/my-runner

Hi!

恭喜,你已经成功构建了第一个Bazel项目了!

添加依赖关系

对于小项目创建一个规则是可以的,但是随着项目的变大,则需要分别构建项目的不同的部件,最终再组装成产品。这种构建方式可以避免因为局部细小的修改儿导致重现构建整个应用,同时不同的构建步骤可以很好地并发执行以提高构建效率。

我们现在将一个项目拆分为两个部分独立构建,同时设置它们之间的依赖关系。基于上面的例子,我们重写了BUILD构建文件:

java_binary(

name = "my-other-runner",

srcs = ["src/main/java/com/example/ProjectRunner.java"],

main_class = "com.example.ProjectRunner",

deps = [":greeter"],

)

java_library(

name = "greeter",

srcs = ["src/main/java/com/example/Greeting.java"],

)

虽然源文件是一样的,但是现在Bazel将采用不同的方式来构建:首先是构建 greeter库,然后是构建 my-other-runner。可以在构建成功后立刻运行 //:my-other-runner:

$ bazel run //:my-other-runner

INFO: Found 1 target...

Target //:my-other-runner up-to-date:

bazel-bin/my-other-runner.jar

bazel-bin/my-other-runner

INFO: Elapsed time: 2.454s, Critical Path: 1.58s

INFO: Running command line: bazel-bin/my-other-runner

Hi!

现在如果你改动ProjectRunner.java代码并重新构建my-other-runner目标,Greeting.java文件因为没有变化而不会重现编译。

使用多个包(Packages)

对于更大的项目,我们通常需要将它们拆分到多个目录中。你可以用类似//path/to/directory:target-name的名字引用在其他BUILD文件定义的目标。假设src/main/java/com/example/有一个cmdline/子目录,包含下面的文件:

$ mkdir -p src/main/java/com/example/cmdline

$ cat > src/main/java/com/example/cmdline/Runner.java <

package com.example.cmdline;

import com.example.Greeting;

public class Runner {

public static void main(String args[]) {

Greeting.sayHi();

}

}

EOF

Runner.java依赖com.example.Greeting,因此我们需要在src/main/java/com/example/cmdline/BUILD构建文件中添加相应的依赖规则:

# ~/gitroot/my-project/src/main/java/com/example/cmdline/BUILD

java_binary(

name = "runner",

srcs = ["Runner.java"],

main_class = "com.example.cmdline.Runner",

deps = ["//:greeter"]

)

然而,默认情况下构建目标都是 私有 的。也就是说,我们只能在同一个BUILD文件中被引用。这可以避免将很多实现的细节暴漏给公共的接口,但是也意味着我们需要手工允许runner所依赖的//:greeter目标。就是类似下面这个在构建runner目标时遇到的错误:

$ bazel build //src/main/java/com/example/cmdline:runner

ERROR: /home/user/gitroot/my-project/src/main/java/com/example/cmdline/BUILD:2:1:

Target '//:greeter' is not visible from target '//src/main/java/com/example/cmdline:runner'.

Check the visibility declaration of the former target if you think the dependency is legitimate.

ERROR: Analysis of target '//src/main/java/com/example/cmdline:runner' failed; build aborted.

INFO: Elapsed time: 0.091s

可用通过在BUILD文件增加visibility = level属性来改变目标的可间范围。下面是通过在~/gitroot/my-project/BUILD文件增加可见规则,来改变greeter目标的可见范围:

java_library(

name = "greeter",

srcs = ["src/main/java/com/example/Greeting.java"],

visibility = ["//src/main/java/com/example/cmdline:__pkg__"],

)

这个规则表示//:greeter目标对于//src/main/java/com/example/cmdline包是可见的。现在我们可以重新构建runner目标程序:

$ bazel run //src/main/java/com/example/cmdline:runner

INFO: Found 1 target...

Target //src/main/java/com/example/cmdline:runner up-to-date:

bazel-bin/src/main/java/com/example/cmdline/runner.jar

bazel-bin/src/main/java/com/example/cmdline/runner

INFO: Elapsed time: 1.576s, Critical Path: 0.81s

INFO: Running command line: bazel-bin/src/main/java/com/example/cmdline/runner

Hi!

参考文档 中有可见性配置说明。

部署

如果你查看 bazel-bin/src/main/java/com/example/cmdline/runner.jar 的内容,可以看到里面只包含了Runner.class,并没有保护所依赖的Greeting.class:

$ jar tf bazel-bin/src/main/java/com/example/cmdline/runner.jar

META-INF/

META-INF/MANIFEST.MF

com/

com/example/

com/example/cmdline/

com/example/cmdline/Runner.class

这只能在本机正常工作(因为Bazel的runner脚本已经将greeter jar添加到了classpath),但是如果将runner.jar单独复制到另一台机器上讲不能正常运行。如果想要构建可用于部署发布的自包含所有依赖的目标,可以构建runner_deploy.jar目标(类似_deploy.jar以_deploy为后缀的名字对应可部署目标)。

$ bazel build //src/main/java/com/example/cmdline:runner_deploy.jar

INFO: Found 1 target...

Target //src/main/java/com/example/cmdline:runner_deploy.jar up-to-date:

bazel-bin/src/main/java/com/example/cmdline/runner_deploy.jar

INFO: Elapsed time: 1.700s, Critical Path: 0.23s

runner_deploy.jar中将包含全部的依赖。

下一步

现在,您可以创建自己的目标并组装最终产品了。接下来,可查看 相关教程 分别学习如何用Bazel构建一个服务器、Android和iOS应用。也可以参考 用户手册获得更多的信息。如果有问题的话,可以到 bazel-discuss 论坛提问。

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

bazel 链接_如何使用bazel build相关推荐

  1. bazel 链接_学习使用bazel

    标签: 编译tensorflow用到bazel,学习一下. 2018-12-26 21:56:23 安装bazel 然后chmod +x , 以及放到PATH中的某个路径下.需要的话设置个软链接. b ...

  2. bazel 链接_安装和配置bazel

    2018-12-26 21:56:23 编译和移植tensorflow的C/C++源码时,用到bazel这一构建工具.本篇blog记录遇到的安装.配置问题. 吐槽 构建工具,从make/ant/cma ...

  3. bazel 链接_[bazel]-bazel的使用

    Change log 目录 一.是什么 二.安装 官网有安装教程.提供了三种安装方式.下面的homebrew是其中一种安装方式. step1: install the JDK Download the ...

  4. bazel 链接第三方动态库_如何自己制作静态库?

    前言 在<一文带你了解静态库和动态库>一文中介绍了静态库的特点以及与动态库的区别.那么你有没有想过如何把自己写好的函数接口制作成静态库给别人用呢?本文教你如何制作属于自己的静态库. 编译成 ...

  5. bazel 链接第三方动态库_惠州权威信息系统安全检测第三方

    惠州权威信息系统安全检测第三方 dga55b69 惠州权威信息系统安全检测第三方 IOT渗透测试是一项基于STRIDE模型对功能业务进行威胁发现的服务.从而避攻击者通过IDAP等逆向工具反编译SO.M ...

  6. bazel 链接_bazel使用汇总

    最近重构代码之后,打算在本地用bazel来作项目构建.主要是因为brpc已经支持了bazel,所以在此之前料想会简单许多. 安装比较简单,centos直接用yum就行.按照这个指示: 1 wget h ...

  7. bazel 链接_bazel-链接第三方动态库,静态库。

    demo4示例 链接第三方动态库,静态库. 使用cc_import链接外部库.原理是通过cc_import规则导入第三方库,然后cc_binary再依赖cc_import规则的target,也即依赖第 ...

  8. bazel 链接第三方动态库_Linux 动态库与静态库制作及使用详解

    Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题: 2)在 Linux 静态库的制作过程中发现有别于 Windo ...

  9. bazel 链接第三方动态库_C语言学习篇(31)——linux中制作动态链接库

    引言 前面我们讲解了什么是函数库(函数库就是一些事先写好的函数集合),函数库有什么作用(可以打包我们的编写的源代码,供他人使用,同时源码不可见,保护了自己的知识产权)以及函数库有2种提供方式:静态链接 ...

最新文章

  1. php常见的类库-文件操作类
  2. LeetCode:Unique Binary Search Trees
  3. tomcat 在eclipse中可以启动,独立不能启动
  4. android 上下滚动文字_计算机毕设项目004之Android系统在线小说阅读器
  5. Git中的bash与CMD的区别
  6. ORB论文研读与代码实现
  7. 使用vue的生命周期函数_异步_同步获取字典数据---基于Vue的uniapp手机端_前端UI_uview工作笔记003
  8. vs2019加载调试动态库dll文件
  9. Sql 查询库、表、列名的语句
  10. instagram 爬虫 2021,下载可用
  11. Power BI数据源之web
  12. URL 编码和解码工具
  13. 【服务器】服务器安全防护、防止服务器攻击和保护措施
  14. 简单整理一下以英文字母命名或者开头的语言
  15. 基础平台项目之树形菜单权限配置实现
  16. QKX-ZSZ-4000岩体真三轴动静载荷-应力应变曲线绘制软件
  17. 利用python进行数据分析数据集_《利用Python进行数据分析》终章·数据分析案例·学习笔记(二)...
  18. for循环后面跟分号 - for (i = 0; i = 3; i++);这不是错误语句
  19. 树莓派驱动6轴传感器MPU6500与SPI初体验(二)
  20. android note【转】

热门文章

  1. 网易云信 7 周年丨服务超过 150 万开发者,消息量突破 20000 亿条
  2. 面向对象 1-类和对象
  3. 计算机科学与技术中英翻译,[精品]计算机科学与技术外文翻译、中英对照、英汉互译.doc...
  4. python i18n 国际化简单实现-easy_i18n
  5. matlab 半正定规划,半定规划算法(Semi-Definite Programming Algorithm).ppt
  6. 电阻选型,这几个参数你必须要知道
  7. vue响应式系统--observe、watcher、dep
  8. null写在==的前面和后面有什么区别
  9. 快来看看这几个iPhone手机的实用功能
  10. js获取更改css伪类