精华内容
下载资源
问答
  • 2020-09-03 17:25:17

    bazel:是一个可以快速构建和测试任意规模软件的编译工具,能够用来编译大部分语言。Bazel使用分布式缓存和增量构建方法,使得编译更加快速。

    Bazel 主要文件
    使用 Bazel 管理的项目一般包含以下几种 Bazel 相关的文件:WORKSPACE,BUILD(.bazel),.bzl 和 .bazelrc 等。其中 WORKSPACE 和 .bazelrc 放置于项目的根目录下,BUILD.bazel 放项目中的每个文件夹中(包括根目录), .bzl 文件可以根据用户喜好自由放置,一般可放在项目根目录下的某个专用文件夹(比如 build)中。

    WORKSPACE

    1.定义项目根目录和项目名。
    2.加载 Bazel 工具和 rules 集。
    3.管理项目外部依赖库。
    
    # 加载bazel标准库中的函数http_archive
    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
    
    # 调用http_archive下载rules_go
    http_archive(
        name = "io_bazel_rules_go",
        # 下面两项需要根据官方的最近版本来修改
        urls = ["https://github.com/bazelbuild/rules_go/releases/download/0.16.1/rules_go-0.16.1.tar.gz"],
        sha256 = "f87fa87475ea107b3c69196f39c82b7bbf58fe27c62a338684c20ca17d1d8613",
    )
    
    # 获取gazelle
    http_archive(
        name = "bazel_gazelle",
        # 同样需要根据官方最新版本修改
        urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/0.15.0/bazel-gazelle-0.15.0.tar.gz"],
        sha256 = "6e875ab4b6bf64a38c352887760f21203ab054676d9c1b274963907e0768740d",
    )
    
    # 从rules_go中加载go_rules_dependencies,go_register_toolchains
    load("@io_bazel_rules_go//go:def.bzl", "go_rules_dependencies", "go_register_toolchains")
    
    # 加载rules_go依赖
    go_rules_dependencies()
    
    # 加载rules_go工具
    go_register_toolchains()
    
    # 从gazelle中加载gazelle_dependencies
    load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")
    
    # 加载gazelle依赖
    gazelle_dependencies()
    

    BUILD.(bazel)
    该文件主要针对其所在文件夹进行依赖解析(label)和目标定义(bazel target)。拿 go 来说,构建目标可以是 go_binary、go_test、go_library 等。

    Bazel 的之前版本用的文件名是 BUILD ,但是在一些大小写不区分的系统上,它很容易跟 build 文件混淆,因此后来改为了显式的 BUILD.bazel 。如果项目中同时存在两者,Bazel 更倾向于使用后者。对于所有的新项目,都推荐使用显式的 BUILD.bazel。

    为了引用一个依赖,Bazel 使用 label 语法对所有的包进行唯一标识,其格式如下:

    @workerspace_name//path/of/package:target
    

    比如,go 中常用的一个日志库 logrus 的 label 为:

    @com_github_sirupsen_logrus//:go_default_library
    

    如果是本项目中的包路径,可以将 // 之前的 workspace 名字省去。

    自定义 rule (*.bzl)
    如果你的项目有一些复杂构造逻辑、或者一些需要复用的构造逻辑,那么可以将这些逻辑以函数形式保存在 .bzl 文件,供 WORKSPACE 或者 BUILD 文件调用。其语法跟 Python 类似:

    def third_party_http_deps():
        http_archive(
            name = "xxxx",
            ...
        )
    
        http_archive(
            name = "yyyy",
            ...
        )
    

    配置项 .bazelrc
    其中 rc 后缀的命名方式是个计算机中经典的小习俗,感兴趣可以看看 StackOverflow 这个回答。简单的说,该文件用来配置对应的命令运行时的一些参数。常见的如 .vimrc,.bashrc 等。

    对于 Bazel 来说,如果某些构建动作都需要某个参数,就可以将其写在此配置中,从而省去每次敲命令都重复输入该参数。举个 Go 的例子:由于国情在此,构建、测试和运行时可能都需要 GOPROXY,则可以配置如下:

    # set GOPROXY
    test --action_env=GOPROXY=https://goproxy.io
    build --action_env=GOPROXY=https://goproxy.io
    run --action_env=GOPROXY=https://goproxy.io
    

    Bazel 构建 golang 项目

    在有了上面 Bazel 的基础知识后,构建 golang 项目还需要了解两个概念:rules_go 和 bazel gazelle。
    rules_go
    rules_go 是一个 Bazel 的扩展包,Bazel 可以编译 Go。它由一系列的 rule 构成,包括 go_libray\go_binary\go_test,支持 vendor、交叉编译;可以方便集成 protobuf 、cgo 、gogo、nogo等工具。

    它会在 Bazel 的沙箱中进行编译,不依赖本地 GOROOT/GOPATH,而是自动下载对应 Go 版本,从而可以在不同平台上进行一致性的编译。

    bazel gazelle
    Gazelle 是一个自动生成 Bazel 编译文件工具,包括给 WORKSPACE 添加外部依赖、扫描源文件依赖自动生成 BUILD.bazel 文件等。Gazelle 原生支持 Go 和 protobuf,当然可以通过扩展来支持其他语言和规则。Gazelle 可以使用 bazel 命令结合 gazelle rule 运行,也可以下载使用单独的 Gazelle 的命令行工具。

    1. 自动添加外部依赖
      bazel run //:gazelle update-repos repo-uri 可以从 go.mod 导入对应依赖包。
      比如想要往项目中增加 Kafka 的 segmentio 的 go client 包,只需要在项目根目录下执行命令: bazel run //:gazelle update-repos github.com/segmentio/kafka-g
      Gazelle 便会自动增加一条依赖到 WORKSPACE 文件:
    go_repository(
        name = "com_github_segmentio_kafka_go",
        importpath = "github.com/segmentio/kafka-go",
        sum = "h1:Mv9AcnCgU14/cU6Vd0wuRdG1FBO0HzXQLnjBduDLy70=",
        version = "v0.3.4",
    )
    
    1. 自动生成构建文件
      Gazelle 能够自动生成每个目录下的 BUILD.bazel 文件,只需要简单的两步:
      (1)在项目根目录的 BUILD.bazel 中配置加载并配置 Gazelle:
        load("@bazel_gazelle//:def.bzl", "gazelle")
        # gazelle:prefix your/project/url    
        gazelle(name = "gazelle") 
    

    需要注意的是 # 后面的内容对于 Bazel 而言是注释,对于 Gazelle 来说却是一种语法,会被 Gazelle 运行时所使用。当然 Gazelle 除了可以通过 bazel rule 运行,也可以单独在命令行中执行。

    (2)在根目录下执行 bazel run //:gazelle

    一些实践
    Bazel 有一些比较实用的实践,比如使用 http_archive 下载确定版本的外部依赖包、使用 stamp 变量注入、打包和发布等等。可以多去一些有很好的 Bazel 构建项目实践的开源项目中去看看:

    github.com/kubernetes/test-infra(go 语言项目最佳实践,比较全面的 bazel 深度使用)
    github.com/kubernetes/repo-infra(go 语言项目最佳实践,配置和脚本非常精妙)
    

    1. 创建工作空间WORKSPACE和BUILD.bazel:
    在使用bazel的时候,需要先创建一个WORKSPACE文件在你的项目根目录,表示这是bazel的工作空间,后续所有的配置都是基于这个目录来的。
    要在当前 project 的根目录下创建 WORKSPACE 和 BUILD.bazel 文件。其中 WORKSPACE 文件用于设置加载 Bazel 环境(包括rules)和相关依赖。
    创建一个WORKSPACE文件 添加以下内容:

    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
    
    http_archive(
        name = "io_bazel_rules_go",
        urls = [
            "https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/rules_go/releases/download/0.19.0/rules_go-0.19.0.tar.gz",
            "https://github.com/bazelbuild/rules_go/releases/download/0.19.0/rules_go-0.19.0.tar.gz",
        ],
        sha256 = "9fb16af4d4836c8222142e54c9efa0bb5fc562ffc893ce2abeac3e25daead144",
    )
    
    load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains")
    
    go_rules_dependencies()
    go_register_toolchains()
    

    这里面的内容不需要手写啊,你去https://github.com/bazelbuild/rules_go/releases 复制过来就好了。

    然后创建一个BUILD.bazel文件,添加一下内容:

    load("@io_bazel_rules_go//go:def.bzl", "go_binary")
    
    go_binary(
        name = "go_default_library",
        srcs = ["main.go"],
        importpath = "test",
        visibility = ["//visibility:private"],
    )
    

    2. 编写main.go
    配置了上面的东西之后,我们在项目目录下创建一个main.go的文件,内容如下:

    package main
    
    import "fmt"
    
    func main() {
    	fmt.Println("hello go!!!!")
    }
    

    当前的目录结构:
    在这里插入图片描述
    非常简单,只有3个文件,然后我们看下怎么用bazel来运行这个go程序。

    在项目的根目录下执行一下命令:

    bazel run //:go_default_library
    

    如果你是第一次跑的话可能会需要一点时间:
    在这里插入图片描述

    3. 使用gazelle自动生成BUILD.bazel文件
    上面看到了,我们需要手写BUILD.bazel?那如果大项目包很多的话,不是要写到吐血?下面就来说下,怎么用gazelle这个工具来自动给每个包生成一个BUILD.bazel的文件。

    需要添加gazelle这个工具到我们的WORKSPACE文件中。

    # 加载bazel标准库中的函数 http_archive
    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
    # 调用http_archive下载rules_go
    http_archive(
        name = "io_bazel_rules_go",
        # 下面两项需要根据官方的最近版本来修改
        urls = ["https://github.com/bazelbuild/rules_go/releases/download/0.16.1/rules_go-0.16.1.tar.gz"],
        sha256 = "f87fa87475ea107b3c69196f39c82b7bbf58fe27c62a338684c20ca17d1d8613",
    )
    # 获取gazelle
    http_archive(
        name = "bazel_gazelle",
        # 同样需要根据官方最新版本修改
        urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/0.15.0/bazel-gazelle-0.15.0.tar.gz"],
        sha256 = "6e875ab4b6bf64a38c352887760f21203ab054676d9c1b274963907e0768740d",
    )
    # 从rules_go中加载go_rules_dependencies,go_register_toolchains
    load("@io_bazel_rules_go//go:def.bzl", "go_rules_dependencies", "go_register_toolchains")
    # 加载rules_go依赖
    go_rules_dependencies()
    # 加载rules_go工具
    go_register_toolchains()
    # 从gazelle中加载gazelle_dependencies
    load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")
    # 加载gazelle依赖
    gazelle_dependencies()
    

    然后修改跟目录下的BUILD.bazel文件内容如下:

    load("@bazel_gazelle//:def.bzl", "gazelle")
    
    # gazelle:prefix your_project_name
    gazelle(name = "gazelle")
    

    然后运行以下命令:

    bazel run //:gazelle
    

    构建
    1.使用gazelle生成build文件
    2.使用生成的build文件构建项目代码

    使用gazelle自动生成build文件
    bazel run //:gazelle
    
    #使用生成的build文件构建
    #构建根目录下所有target
    bazel build //...
    #构建特定taget
    bazel build //path/of/target:target_name
    

    Golang项目bazel指北:
    https://zhuanlan.zhihu.com/p/52155083
    使用bazel编译go项目
    https://juejin.im/post/6844903892757528590
    使用 Bazel 构建 Golang 项目
    https://blog.didiyun.com/index.php/2019/03/27/bazel-golang/
    Bazel 构建 golang 项目
    https://zhuanlan.zhihu.com/p/95998597

    更多相关内容
  • 适用于Visual Studio Code的Bazel插件 此扩展为Visual Studio中的Bazel提供支持。 特征 Bazel Build Targets树显示工作空间中的构建包/目标 只需单击目标,BUILD文件中的CodeLens链接即可直接启动构建或测试 ...
  • bazel-to-msbuild 从bazel项目生成msbuild项目 它使用bazel query ... output=proto来收集所有cc_library,cc_binary和cc_test软件包; 它为每个软件包生成msbuild项目。 它为一个闲置工作区生成了一种解决方案。...
  • distroless-bazel 该存储库包含有关以样式生成包含bazel的容器图像的。 $ docker run gcr.io/stack-build/distroless/bazel:0.14.1 version Extracting Bazel installation... Build label: 0.14.1 Build target: ...
  • 带有Bazel示例的Android NDK 指示 启动模拟器 运行bazel mobile-install //app/src/main:app --fat_apk_cpu=x86 --incremental --start_app 利润 建立图 JNI / C ++源代码进入cc_library目标, //app/src/main:jni...
  • Bazel容器映像规则 特拉维斯CI Bazel CI 基本规则 () () () () 这些规则以前是docker_build , docker_push等,并且这些(主要是)旧名称的别名在很大程度上仍然向后兼容。 对于拥有一致规则前缀一致...
  • 导入java类库含源码包bazel-deps 借助 Scala 支持,为 Maven 工件生成可传递的依赖项。 快速开始 这个 repo 可以在本地克隆和构建,或者你可以在发布页面下载适用于 MacOS 和 Linux 的预构建二进制文件。 针对 ...
  • rules_boost -Bazel构建Boost的规则 要使用这些规则,请将以下内容添加到您的WORKSPACE文件中: load ( "@bazel_tools//tools/build_defs/repo:git.bzl" , "git_repository" ) git_repository ( name = ...
  • 操作Bazel工作区的规则 安装 load ( "@bazel_tools//tools/build_defs/repo:http.bzl" , "http_archive" ) http_archive ( name = "bzlws" , strip_prefix = "bzlws-557f409ffcb2425b0fc4cb4526b2e2e9fa9601f0" , ...
  • rules_cc:Bazel的C ++规则

    2021-03-16 21:46:31
    Bazel的C ++规则 提交后 提交后+当前Bazel不兼容标志 该存储库包含Bazel中Starlark C ++规则的实现。 这些规则已从其在中的本机实现中进行了增量转换。 有关C ++规则的列表,请参阅Bazel。 入门 现在还不需要...
  • tensorflow bazel 生成文件 bazel-genfiles,没有环境想阅读代码的这里下载
  • bazel-3.7.2-windows-x86_64.exe.zip
  • 进行实验,看看我们是否可以使用来运行Python测试。 关于榛子钉的注意事项 介绍 最好在每次更改之前运行完整的测试套件,因此您可以确信更改不会破坏主版本。... $ bazel build examples/java-native/src/main/j
  • 这个bazel是和onos_v2.6.0对应使用的
  • 规定在您的bazel版本中使用的 。 执照 这是发布到公共领域的免费且不受限制的软件。 任何人都可以以任何目的,商业目的或非商业目的,以源代码形式或作为已编译的二进制文件自由地复制,修改,发布,使用,编译,...
  • (可选地)如果bazel二进制中未在路径的路径设置为它在local.properties : bazel.bin.path=/usr/local/bin/bazel 使用Android Studio打开此项目。 阅读“部分。 回购结构: app - an Android app which is built...
  • bazel-erlang

    2021-03-04 19:41:01
    bazel_erlang 适用于Erlang来源的Bazel规则 最小的例子 load ( "@bazel-erlang//:bazel_erlang_lib.bzl" , "bazel_erlang_lib" , "erlang_lib" , "erlc" ) load ( "@bazel-erlang//:ct.bzl" , "ct_suite" ) APP_...
  • Cocoapods :: Bazel Cocoapods :: Bazel是一个Cocoapods插件,可以轻松使用而不是Xcode来构建您的iOS项目。 它会自动生成Bazel的BUILD.bazel文件。 它使用因此您需要按照的说明来设置WORKSPACE文件。 :warning: ...
  • Bazel的安装包,官网下载速度慢,可使用此链接 先下载Bazel的安装包 https://github.com/bazelbuild/bazel/releases,我下载的是bazel-0.10.1-installer-linux-x86_64.sh 然后执行安装 ./bazel-0.10.1-installer-...
  • Bazel_bin:Bazel针对armv7l aarch64 x86_64的预构建二进制文件
  • aarch64可用的bazel-0.15.0

    2019-11-25 17:31:38
    ubuntu18 aarch64环境下编译出来的bazel-0.15.0,对应的tensorflow版本是0.12.0,费劲千辛万苦编译出来的,需要的可以下载下来试试,直接放到/usr/bin下增加权限sudo chmod a+x bazel就可以了
  • java特殊符号转义源码Bazel (αlpha) 的关闭规则 JavaScript 模板制作 样式表 各种各样的 (实验性) (实验性) 概述 Closure Rules 提供了一个完善的 JavaScript 构建系统,强调类型安全、严格性、可测试性和优化...
  • 使用bazel生成Visual Studio项目。 这些项目使用bazel进行实际的建筑。 目前,这仅适用于C ++。 计划支持以其他语言构建目标。 以前是bazel-msbuild。 先决条件 zel Python 2或3 入门 在常规开发环境(MSYS bash...
  • win10+vs2019+py3.7.9+bazel0.29.1+tensorflow2.1.1-CPU 支持AVX2指令集 由于机器无N卡,只能编译cpu版,后续再编译其他版本 测试程序含官方的c++例子和网上找的代码,散布在包内,及模型pb文件在data目录,在vs2019...
  • Bazel Maven代理 Bazel的本地(只读)代理,可访问安全存储库后面或本地Maven存储库中的Maven资源 产品特点 提供对需要通过https://127.0.0.1:8499/maven/<repository>/...进行身份验证的Maven存储库的无密码访问...
  • assemble_maven assemble_maven( , , , , , , , , , , , ) 组装Java软件包以用于随后的Maven回购 属性 名称 描述 类型 强制性的 ... 或者,将--define version = VERSION传递给Bazel调用。 完全不指定
  • bazel模式:Emacs的基本Bazel支持
  • bazel-remote-proxy

    2021-04-29 15:02:15
    使用bazel-remote-proxy Usage of bazel-remote-proxy: -backend string uri of backend storage service, e.g. s3://my-bazel-cache/prefix -bind string address and port to bind to (default "127.0.0.1:...
  • 一个使用bazel构建scala的最小示例,包括一个库,二进制文件和测试。 bazel test example-lib:test bazel run example-bin 还包括使用从maven-dependencies.yaml生成可传递的Maven依赖关系到3rdparty的示例 bazel ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,322
精华内容 3,328
关键字:

bazel