首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以从.bzl文件中加载通用规则?

是否可以从.bzl文件中加载通用规则?
EN

Stack Overflow用户
提问于 2020-03-26 01:03:14
回答 1查看 1.1K关注 0票数 2

我们经常需要每个技术堆栈的通用规则组合。这目前在工作空间中浪费了大量空间-它们应该在多个repos中保持同步。它是构建器后面的50+行,包含太多的urls、版本和散列。

现在假设我有一个“技术堆栈”代码库,并执行如下操作

代码语言:javascript
复制
load("@techstack_repo//mylang.bzl", "load_rules")
load_rules()

load_rules会在哪里加载和初始化固定的版本,例如rules_go,bazel-gazelle,rules_docker,rules_proto,并以正确的顺序初始化所有它们,以便它们在工作区中可见?

我没有在我的测试中让它工作,因为load显然不能在bzl文件中的函数中运行-它本身不是一个函数。

有没有办法做到这一点?

下面是我为Java测试的一个示例:

代码语言:javascript
复制
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()

..。规则存储库的所有http_archive调用都是用WORKSPACE编写的,我想把它们移到这里,但这根本不起作用。按照原样,我得到了这个错误:

代码语言:javascript
复制
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.

此外,添加rules_python也无济于事。

EN

回答 1

Stack Overflow用户

发布于 2020-03-31 21:54:46

我找到了一个解决方案:

将其拆分为两个文件。其中一个包含这样的导入:

代码语言:javascript
复制
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

另一种是使用声明的外部源:

代码语言:javascript
复制
# 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_archivegit_repository获取这个代码库,加载第一个文件并调用declare,为init_rules加载第二个文件并调用它。

这可能有点复杂,但它仍然有助于统一堆栈和简化您的WORKSPACE

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60853736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档