bazel - Bazel WORKSPACE 有条件地定义了两个`git_repository`s之一
问题描述
我正在维护两个 Python 库 A 和 B,每个库都部分使用 Bazel 来构建非 Python 代码。库 B 在 Bazel 方面依赖于 A,因此 B 需要 A 的远程存储库。
- 对于 B 的发布版本,我希望以规范形式拥有 A 的远程存储库,例如
git_repository
带有提交哈希。
git_repository(
name = "A",
commit = "...",
remote = "https://github.com/foo/A",
)
- 在开发过程中,我想以符号链接形式拥有 A 的远程存储库,例如,
git_repository
带有 master 分支。
git_repository(
name = "A",
branch = "master",
remote = "https://github.com/foo/B",
)
我想使用其中之一。经过一些研究,我发现没有可以在 WORKSPACE 级别使用的“条件分支”方法(从命令行标志或环境变量提供)。我正在询问我找不到的任何选项。
以下是我搜索过的替代方案,但不是 100% 满意。
- 在开发过程中使用
local_repository
并不是一个有吸引力的解决方案,因为实际上有 8 个以上的库具有链式依赖关系,我认为手动克隆有时拉取它们是不现实的。 - 在 BUILD 级别使用
alias()
withselect()
也不是很有吸引力的解决方案,因为事实证明在 B 中使用了数十个 A 的 blaze 目标。为所有这些目标定义别名无法大规模维护。(或者有没有办法在包级别定义别名?)。
# WORKSPACE
git_repository(name = "A", ...)
git_repository(name = "A_master", ...)
# BUILD
config_setting(name = "use_master", ...)
alias(
name = "A_pkg_label", # There are too many targets to declare
actual = select({
":use_master": "@A_master/pkg:label",
"//conditions:default": "@A/pkg:label",
})
)
- 使用两个 WORKSPACE 文件似乎是可行的,但除了手动重命名它们之外,我找不到选择 WORKSPACE 文件的干净方法。
- 定义 custom
repository_rule
,按值分支repository_ctx.os.environ
,似乎很有希望,直到我发现我不能在实现中重用其他存储库规则。
解决方案
虽然您一般不能重用其他存储库规则,但实际上其中许多规则是用 Starlark 编写的,并且易于重用。例如,git_repository
的实现如下所示:
def _git_repository_implementation(ctx):
update = _clone_or_update(ctx)
patch(ctx)
ctx.delete(ctx.path(".git"))
return _update_git_attrs(ctx.attr, _common_attrs.keys(), update)
如果您只使用基本功能,或者可能load
来自您自己的 starlark 代码,那么大多数这些实用程序功能要么是 NOP。你可以用这个来做一个准系统替换:
load("@bazel_tools//tools/build_defs/repo:git_worker.bzl", "git_repo")
def _my_git_repository_implementation(ctx):
directory = str(ctx.path("."))
git_repo(ctx, directory)
ctx.delete(ctx.path(".git"))
推荐阅读
- c++ - 我如何获得正确的答案而不仅仅是随机数?
- python - 查找函数的梯度:Sympy vs. Jax
- bokeh - 如何获得 Object 触发了回调的 Bokeh 回调?
- arrays - ConvertTo-JSON 错误地解析数组
- node.js - 在nodejs中获取整个错误堆栈跟踪
- html - IE11 和 Edge 18:为什么与 rel=prefetch 结合使用时不会触发 onload?
- javascript - 为什么我的传单地图一直显示空白区域
- oracle - Oracle Apex - 使用动态操作刷新区域
- xamarin.forms - Xamarin.Forms 如何将代码中的数据绑定到滑动视图(在 xaml 中工作)
- javascript - 防止后处理程序最小化应用程序