Bazel 我可以从.bzl文件加载公共规则吗?
我们经常需要每个技术堆栈的通用规则组合。 这目前浪费了工作空间中的大量空间,它们应该在多个repo上保持同步。它在buildifier之后有50多行,包含太多的URL、版本和哈希 现在,假设我有一个“技术堆栈”回购协议,并做类似的事情Bazel 我可以从.bzl文件加载公共规则吗?,bazel,bazel-rules,Bazel,Bazel Rules,我们经常需要每个技术堆栈的通用规则组合。 这目前浪费了工作空间中的大量空间,它们应该在多个repo上保持同步。它在buildifier之后有50多行,包含太多的URL、版本和哈希 现在,假设我有一个“技术堆栈”回购协议,并做类似的事情 load("@techstack_repo//mylang.bzl", "load_rules") load_rules() 如果load_rules将加载并初始化固定版本的规则,例如rules_go、bazel gazelle、rules_docker、rul
load("@techstack_repo//mylang.bzl", "load_rules")
load_rules()
如果load_rules
将加载并初始化固定版本的规则,例如rules_go、bazel gazelle、rules_docker、rules_proto,并以正确的顺序初始化所有规则,以便它们在工作区中可见
我在测试中没有做到这一点,因为load
显然不能在bzl文件中的函数中运行-它不是函数本身
有办法做到这一点吗
下面是我为Java测试的一个示例:
load("@io_bazel_rules_docker//repositories:repositories.bzl", container_repositories = "repositories")
load("@io_bazel_rules_docker//repositories:deps.bzl", container_deps = "deps")
load("@io_bazel_rules_docker//container:container.bzl", "container_pull")
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains")
load(
"@io_grpc_grpc_java//:repositories.bzl",
"IO_GRPC_GRPC_JAVA_ARTIFACTS",
"IO_GRPC_GRPC_JAVA_OVERRIDE_TARGETS",
"grpc_java_repositories",
)
load("@rules_jvm_external//:defs.bzl", "maven_install")
def prepare_stack(maven_deps = []):
container_repositories()
container_deps()
container_pull(
name = "java_base",
# https://console.cloud.google.com/gcr/images/distroless/GLOBAL/java-debian10
# tag = "11", # OpenJDK 11 as of 2020-03-04
digest = "sha256:eda9e5ae2facccc9c7016f0c2d718d2ee352743bda81234783b64aaa402679b6",
registry = "gcr.io",
repository = "distroless/java-debian10",
)
rules_proto_dependencies()
rules_proto_toolchains()
maven_install(
artifacts = maven_deps + IO_GRPC_GRPC_JAVA_ARTIFACTS,
# for improved debugging in IDE
fetch_sources = True,
generate_compat_repositories = True,
override_targets = IO_GRPC_GRPC_JAVA_OVERRIDE_TARGETS,
repositories = [
"https://repo.maven.apache.org/maven2/",
"https://repo1.maven.org/maven2",
],
strict_visibility = True,
)
grpc_java_repositories()
。。。所有对规则repo的http\u archive
调用都在工作区中,我想将它们移到这里,但这根本不起作用。
按原样,我得到了以下错误:
ERROR: Failed to load Starlark extension '@rules_python//python:pip.bzl'.
Cycle in the workspace file detected. This indicates that a repository is used prior to being defined.
The following chain of repository dependencies lead to the missing definition.
- @rules_python
This could either mean you have to add the '@rules_python' repository with a statement like `http_archive` in your WORKSPACE file (note that transitive dependencies are not added automatically), or move an existing definition earlier in your WORKSPACE file.
另外,添加规则\u python也没有帮助。我找到了一个解决方案:
将其拆分为两个文件。
一个是这样的进口:
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
def declare():
maybe(
git_repository,
name = "rules_cc",
commit = "34ca16f4aa4bf2a5d3e4747229202d6cb630ebab",
remote = "https://github.com/bazelbuild/rules_cc.git",
shallow_since = "1584036492 -0700",
)
# ... for me requires at least rules_cc, rules_python, bazel_skylib
# for later proto, docker, go, java support
另一个使用声明的外部源:
# go
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")
# protobuf
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains")
# container
load("@io_bazel_rules_docker//container:container.bzl", "container_pull")
load("@io_bazel_rules_docker//repositories:repositories.bzl", container_repositories = "repositories")
load("@io_bazel_rules_docker//repositories:deps.bzl", container_deps = "deps")
load("@io_bazel_rules_docker//go:image.bzl", go_image_repositories = "repositories")
def init_rules():
go_rules_dependencies()
go_register_toolchains()
gazelle_dependencies()
rules_proto_dependencies()
rules_proto_toolchains()
container_repositories()
container_deps()
go_image_repositories()
container_pull(
name = "go_static",
digest = "sha256:9b60270ec0991bc4f14bda475e8cae75594d8197d0ae58576ace84694aa75d7a",
registry = "gcr.io",
repository = "distroless/static",
)
这有点麻烦,但是使用http\u archive
或git\u repository
获取此repo,加载第一个文件并调用declare
,为init\u rules
加载第二个文件并调用它
它可能有点复杂,但它仍然有助于统一堆栈并简化您的工作区