Bazel可以依赖其他项目的目标。来自其他项目的依赖关系称为外部依赖关系。
其他项目包含一个或多个具有target
的BUILD
,在主项目中的BUILD
通过使用来自WORKSPACE
的名称实现对外部targets
的依赖。
#现有如下两个项目
/
home/
user/
project1/
WORKSPACE
BUILD
srcs/
...
project2/
WORKSPACE
BUILD
my-libs/
若project1
依赖project2
中的一个目标:foo
,defined in /home/user/project2/BUILD
,它可以指定一个名为project2
的存储库可以在/home/user/project2
中找到 ,则project1
中的BUILD
的目标的依赖对象为:@project2//:foo
依赖其他bazel项目
local_repository
:本地文件系统
假设你的项目为my-project/
,你同事的项目为coworkers-project/
,两个项目均基于Bazel
,你需要依赖你同事项目中的target
。故可在my-projects/WORKSPACE
中加入:
local_repository(
name = "coworkers-project",
path = "/path/to/coworkers-project",
)
若你想依赖同时项目中的//foo:bar
,则可在BUILD
的目标中添加依赖@coworkers-project//foo:bar
git_repository
:git仓库http_archive
:下载
依赖非bazel项目
以new_
为前缀的规则,例如new_local_repository
,允许您从不使用Bazel
从项目中创建目标。
例子同上,只不过此时同事使用make去构建项目。而你需要依赖其构建出的某个.so
文件。
步骤如下:
修改
my_project/WORKSPACE
new_local_repository(
name = "coworkers_project",
path = "/path/to/coworkers-project",
build_file = "coworker.BUILD",
)
build_file
指定一个要覆盖在现有项目上的BUILD文件cc_library(
name = "some-lib",
srcs = glob(["**"]),
visibility = ["//visibility:public"],
)
修改
my_project
中的BUILD
@coworkers_project//:some-lib
Fetching dependencies(没懂)
默认情况下,在bazel
构建过程中会根据需要获取外部依赖项。如果您想预取特定目标集所需的依赖项,请使用bazel fetch
。要无条件地获取所有外部依赖,请使用bazel syn
。由于获取的存储库存储在输出库中,所以每个工作空间都会进行获取。
最佳实践
- 相较于
git_repository
和new_git_repository
,多用http_archive
- 库的规则
- 检测系统设置并将其写入文件。
- 在系统的其他地方查找资源。
- 从url下载资源。
- 将BUILD文件生成或符号链接到外部存储库目录中。
避免使用repository_ctx
。例如,当使用使用Make构建的非bazel c++库时,最好使用repository_ctx.download()
,然后编写一个构建文件来构建它,而不是运行ctx.execute([" Make "])。