Bazel可以依赖其他项目的目标。来自其他项目的依赖关系称为外部依赖关系。
其他项目包含一个或多个具有target的BUILD,在主项目中的BUILD通过使用来自WORKSPACE的名称实现对外部targets的依赖。
#现有如下两个项目/home/user/project1/WORKSPACEBUILDsrcs/...project2/WORKSPACEBUILDmy-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/WORKSPACEnew_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 "])。
