工作区规则用于拉取 外部依赖项,通常是 位于主代码库之外的源代码。
注意: 除了原生工作区规则之外,Bazel 还嵌入了各种 Starlark 工作区规则,尤其是用于处理托管在网络上的 Git 代码库或归档的规则。
规则
bind
查看规则源代码bind(name, actual, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
警告:不建议使用 bind()。如需详细了解其问题和替代方案,请参阅“考虑移除 bind”。特别是,请考虑使用
repo_mapping
代码库属性。
警告:select() 不能在 bind() 中使用。如需了解详情,请参阅可配置属性常见问题解答
。
为 //external 软件包中的目标提供别名。
//external 软件包不是“常规”软件包:没有 external/ 目录,
因此可以将其视为包含所有绑定目标的“虚拟软件包”。
示例
如需为目标提供别名,请在 bind WORKSPACE 文件中。例如,
假设有一个名为 //third_party/javacc-v2 的 java_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,而无需进行修改。
Bind 还可用于使外部代码库中的目标可供您的工作区使用。
例如,如果在
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.cc 和 sign_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 |
名称;必需 此目标的唯一名称。 |
actual
|
标签;默认值为 此目标必须存在,但可以是任何类型的规则(包括 bind)。 如果省略此属性,则在 |
local_repository
查看规则源代码local_repository(name, path, repo_mapping)
允许绑定本地目录中的目标。这意味着当前代码库可以使用在此其他目录中定义的目标。如需了解详情,请参阅 bind 部分。
示例
假设当前代码库是一个聊天客户端,根目录为 ~/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 |
名称;必需 此目标的唯一名称。 |
path
|
字符串;必需 本地代码库目录的路径。这必须是包含代码库的 WORKSPACE 文件的目录的路径。该路径可以是绝对路径,也可以是相对于主代码库的 WORKSPACE 文件的路径。 |
repo_mapping
|
字典:字符串 -> 字符串;默认值为 例如,条目 |
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 库 (~/chat-app/BUILD.my-ssl)创建一个包含以下内容的 BUILD 文件来添加依赖项:
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 文件。您只需将该文件添加到 build,方法是将以下内容添加到 WORKSPACE 文件:
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 |
名称;必需 此目标的唯一名称。 |
build_file
|
名称;默认值为 必须指定 build_file 或 build_file_content。 此属性是相对于主工作区的标签。该文件不需要命名为 BUILD,但可以命名为 BUILD。(类似 BUILD.new-repo-name 的名称可能有助于将其与代码库的实际 BUILD 文件区分开来。) |
build_file_content
|
字符串;默认值为 必须指定 build_file 或 build_file_content。 |
path
|
字符串;必需 本地文件系统上的路径。此路径可以是绝对路径,也可以是相对于主代码库的 WORKSPACE 文件的路径。 |
repo_mapping
|
字典:字符串 -> 字符串;默认值为 例如,条目 |
workspace_file
|
名称;默认值为 可以指定 workspace_file 或 workspace_file_content,但不能同时指定这两者。 此属性是相对于主工作区的标签。该文件不需要命名为 WORKSPACE,但可以命名为 WORKSPACE。(类似 WORKSPACE.new-repo-name 的名称可能有助于将其与代码库的实际 WORKSPACE 文件区分开来。) |
workspace_file_content
|
字符串;默认值为 可以指定 workspace_file 或 workspace_file_content,但不能同时指定这两者。 |