工作区规则用于拉取外部依赖项,通常 位于主代码库之外的源代码
注意:除了原生工作区规则之外,Bazel 还嵌入了各种 Starlark 工作区规则,尤其是用于处理托管在 Web 上的 Git 代码库或归档文件的规则。
规则
bind
查看规则源代码bind(name, actual, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
警告:不建议使用 bind()
。请参阅“考虑移除绑定”长时间
讨论其问题和替代方案。特别是,请考虑使用 repo_mapping
仓库属性。
警告:select()
不能在 bind()
中使用。如需了解详情,请参阅可配置属性常见问题解答。
为 //external
软件包中的目标指定别名。
//external
软件包不是“普通”软件包:没有 external/ 目录,因此可以将其视为包含所有绑定目标的“虚拟软件包”。
示例
如需为目标指定别名,请在 WORKSPACE 文件中对其执行 bind
操作。例如,假设有一个名为 //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,而无需进行修改。
绑定还可用于将外部代码库中的目标设为可供工作区使用。
例如,如果 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
|
标签;默认值为 此目标必须存在,但可以是任何类型的规则(包括绑定)。 如果省略此属性,则在 |
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 |
名称;必需 此目标的唯一名称。 |
path
|
String;必需 本地代码库目录的路径。此参数必须是包含代码库的 WORKSPACE 文件的目录的路径。路径可以是绝对路径,也可以是主代码库 WORKSPACE 文件。 |
repo_mapping
|
字典:String ->String;默认值为 例如,条目 |
new_local_repository
查看规则源代码new_local_repository(name, build_file, build_file_content, path, repo_mapping, workspace_file, workspace_file_content)
允许将本地目录转换为 Bazel 代码库。这意味着 可以在文件系统中的任何位置定义和使用目标。
此规则通过创建一个 WORKSPACE 文件和子目录(其中包含指向给定 BUILD 文件和路径的符号链接)来创建 Bazel 代码库。构建文件应创建相对于
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", )
这将创建一个 @my-ssl
代码库,该代码库通过符号链接到 /home/user/ssl。
目标可以通过将 @my-ssl//:openssl
添加到目标的依赖项来依赖于此库。
您还可以使用 new_local_repository
包含单个文件,而不仅仅是目录。例如,假设您在 /home/username/Downloads/piano.jar 中有一个 jar 文件。您
可以将以下内容添加到 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.new-repo-name 这样 将其与代码库的实际 BUILD 文件区分开来。) |
build_file_content
|
String;默认值为 必须指定 build_file 或 build_file_content。 |
path
|
字符串;必需 本地文件系统上的路径。这可以是主代码库的 WORKSPACE 文件的绝对或相对路径。 |
repo_mapping
|
字典:String ->String;默认值为 例如,条目 |
workspace_file
|
姓名;默认值为 您可以指定 workspace_file 或 workspace_file_content,但不能同时指定这两者。 此属性是相对于主工作区的标签。该文件不必是 名为 WORKSPACE,但可以。(WORKSPACE.new-repo-name 之类的名称可能很适合用于将其与代码库的实际 WORKSPACE 文件区分开来。) |
workspace_file_content
|
字符串;默认值为 可以指定 workspace_file 或 workspace_file_content,但不能同时指定这两者。 |