工作区规则

Workspace 规则用于提取外部依赖项,通常位于主代码库之外的源代码。

注意:除了原生工作区规则之外,Bazel 还嵌入了各种 Starlark 工作区规则,尤其是用于处理托管在 Web 上的 Git 代码库或归档文件的规则。

规则

bind

bind(name, actual, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

警告:不建议使用 bind()。如需详细了解 bind 的问题和替代方案,请参阅“考虑移除 bind”。特别是,请考虑使用 repo_mapping 仓库属性

警告:select() 不能在 bind() 中使用。如需了解详情,请参阅可配置属性常见问题解答

//external 软件包中的目标指定别名。

//external 软件包不是“普通”软件包:没有 external/ 目录,因此可以将其视为包含所有绑定目标的“虚拟软件包”。

示例

如需为目标指定别名,请在 WORKSPACE 文件中对其执行 bind 操作。例如,假设有一个名为 //third_party/javacc-v2java_library 目标。您可以通过向 WORKSPACE 文件添加以下内容来为其添加别名:

bind(
    name = "javacc-latest",
    actual = "//third_party/javacc-v2",
)

现在,目标可以依赖于 //external:javacc-latest,而不是 //third_party/javacc-v2。如果 javacc-v3 发布,则可以更新 bind 规则,并且依赖于 //external:javacc-latest 的所有 BUILD 文件现在都将依赖于 javacc-v3,而无需进行修改。

绑定还可用于将外部代码库中的目标提供给您的工作区。 例如,如果 WORKSPACE 文件中导入了名为 @my-ssl 的远程代码库,并且该代码库包含 cc_library 目标 //src:openssl-lib,则您可以使用 bind 为此目标创建别名:

bind(
    name = "openssl",
    actual = "@my-ssl//src:openssl-lib",
)

然后,在工作区的 BUILD 文件中,可以按如下方式使用绑定的目标:

cc_library(
    name = "sign-in",
    srcs = ["sign_in.cc"],
    hdrs = ["sign_in.h"],
    deps = ["//external:openssl"],
)

sign_in.ccsign_in.h 中,可以使用相对于代码库根目录的路径来引用 //external:openssl 公开的头文件。例如,如果 @my-ssl//src:openssl-lib 的规则定义如下所示:

cc_library(
    name = "openssl-lib",
    srcs = ["openssl.cc"],
    hdrs = ["openssl.h"],
)

然后,sign_in.cc 的 include 可能如下所示:

#include "sign_in.h"
#include "src/openssl.h"

参数

属性
name

Name; required

此目标的唯一名称。

actual

Label; optional

要添加别名的目标。

此目标必须存在,但可以是任何类型的规则(包括绑定)。

如果省略此属性,则在 //external 中引用此目标的规则将根本不会看到此依赖项边。请注意,这与完全省略 bind 规则不同:如果 //external 依赖项没有关联的 bind 规则,则会出错。

local_repository

local_repository(name, path, repo_mapping)

允许绑定本地目录中的目标。这意味着,当前代码库可以使用在此其他目录中定义的目标。如需了解详情,请参阅绑定部分

示例

假设当前代码库是一个聊天客户端,其根目录为 ~/chat-app。该客户端希望使用在其他代码库 ~/ssl 中定义的 SSL 库。SSL 库具有目标 //src:openssl-lib

用户可以通过将以下代码行添加到 ~/chat-app/WORKSPACE 来添加对此目标的依赖项:

local_repository(
    name = "my-ssl",
    path = "/home/user/ssl",
)

目标会将 @my-ssl//src:openssl-lib 指定为依赖项,以便依赖于此库。

参数

属性
name

Name; required

此目标的唯一名称。

path

String; required

本地代码库目录的路径。

此参数必须是包含代码库的 WORKSPACE 文件的目录的路径。该路径可以是绝对路径,也可以是相对于主代码库的 WORKSPACE 文件的相对路径。

repo_mapping

Dictionary: String -> String; optional

一个字典,用于将本地代码库名称转换为全局代码库名称。这样,您就可以控制此代码库的依赖项的工作区依赖项解析。

例如,条目 "@foo": "@bar" 声明,每当此代码库依赖于 "@foo"(例如对 "@foo//some:target" 的依赖项)时,它实际上应在全局声明的 "@bar" ("@bar//some:target") 中解析该依赖项。

new_local_repository

new_local_repository(name, build_file, build_file_content, path, repo_mapping, workspace_file, workspace_file_content)

允许将本地目录转换为 Bazel 代码库。这意味着,当前代码库可以在文件系统中的任意位置定义和使用目标。

此规则通过创建一个 WORKSPACE 文件和包含指向给定 BUILD 文件和路径的符号链接的子目录来创建 Bazel 代码库。build 文件应创建相对于 path 的目标。对于已包含 WORKSPACE 文件和 BUILD 文件的目录,可以使用 local_repository 规则。

示例

假设当前代码库是一个聊天客户端,其根目录为 ~/chat-app。该客户端希望使用在其他目录 ~/ssl 中定义的 SSL 库。

用户可以通过为 SSL 库创建 BUILD 文件 (~/chat-app/BUILD.my-ssl) 来添加依赖项,其中包含:

java_library(
    name = "openssl",
    srcs = glob(['*.java'])
    visibility = ["//visibility:public"],
)

然后,他们可以将以下代码行添加到 ~/chat-app/WORKSPACE

new_local_repository(
    name = "my-ssl",
    path = "/home/user/ssl",
    build_file = "BUILD.my-ssl",
)

这将创建一个符号链接到 /home/user/ssl@my-ssl 代码库。目标可以通过将 @my-ssl//:openssl 添加到目标的依赖项来依赖于此库。

您还可以使用 new_local_repository 包含单个文件,而不仅仅是目录。例如,假设您在 /home/username/Downloads/piano.jar 中有个 jar 文件。您可以将以下内容添加到 WORKSPACE 文件,以便将该文件添加到 build:

new_local_repository(
    name = "piano",
    path = "/home/username/Downloads/piano.jar",
    build_file = "BUILD.piano",
)

并创建以下 BUILD.piano 文件:

java_import(
    name = "play-music",
    jars = ["piano.jar"],
    visibility = ["//visibility:public"],
)
然后,目标可以依赖于 @piano//:play-music 来使用 piano.jar。

参数

属性
name

Name; required

此目标的唯一名称。

build_file

String; optional

要用作此目录的 BUILD 文件的文件。

必须指定 build_file 或 build_file_content。

此属性是相对于主工作区的标签。该文件不必命名为 BUILD,但可以这样命名。(BUILD.new-repo-name 之类的名称可能非常适合用于将其与代码库的实际 BUILD 文件区分开来。)

build_file_content

String; optional

此代码库的 BUILD 文件的内容。

必须指定 build_file 或 build_file_content。

path

String; required

本地文件系统上的路径。

此路径可以是绝对路径,也可以是相对于主代码库的 WORKSPACE 文件的相对路径。

repo_mapping

Dictionary: String -> String; optional

一个字典,用于将本地代码库名称转换为全局代码库名称。这样,您就可以控制此代码库的依赖项的工作区依赖项解析。

例如,条目 "@foo": "@bar" 声明,每当此代码库依赖于 "@foo"(例如对 "@foo//some:target" 的依赖项)时,它实际上都应在全局声明的 "@bar" ("@bar//some:target") 中解析该依赖项。

workspace_file

String; optional

要用作此代码库的 WORKSPACE 文件的文件。

您可以指定 workspace_file 或 workspace_file_content,但不能同时指定这两者。

此属性是相对于主工作区的标签。该文件不必命名为 WORKSPACE,但可以这样命名。(WORKSPACE.new-repo-name 之类的名称可能很适合用于将其与代码库的实际 WORKSPACE 文件区分开来。)

workspace_file_content

String; optional

此代码库的 WORKSPACE 文件的内容。

您可以指定 workspace_file 或 workspace_file_content,但不能同时指定这两者。