使协议可用于 Bazel 构建

问题描述 投票:0回答:1
理想情况下,这不是一个特定于 Rust 的问题,而只是作为背景:我正在开发一个 Rust 项目,该项目使用

tonic

 进行 gRPC 访问,但稍微扩展了其功能,因此它使用自定义 
build.rs
 脚本来调用原型定义编译器
protoc
。我有一个 Bazel 项目(使用 
MODULE.bazel
 而不是 
WORKSPACE
),它在我的 
cargo_build_script
 文件中定义了 
BUILD.bazel
 部分来运行 
build.rs
,只要我在已经有 
protoc 的系统上运行它
 可用,一切都完美构建。如果我卸载 
protoc
,它就会开始失败并显示 

Error: Custom { kind: NotFound, error: "Could not find `protoc`. If `protoc` is installed, try setting the `PROTOC` environment variable to the path of the `protoc` binary. To install it on Debian, run `apt-get install protobuf-compiler`. It is also available at https://github.com/protocolbuffers/protobuf/releases For more information: https://docs.rs/prost-build/#sourcing-protoc" }
我还需要 Bazel 在我们的 CI 管道中运行构建脚本,默认情况下该管道不附带 

protoc

,因此我试图找到最简单的方法来使 
protoc
 可供 Bazel 使用。我找到了 
toolchains_proto,但我还无法让它工作。我对 Bazel 还是很陌生。所以,如果这是一个微不足道的问题,我深表歉意。

看起来大多数工具链(包括上面链接的工具链?)都是为了在单独的构建步骤中进行 protobuf 编译,而不是作为 Rust

build.rs

的一部分。如果可能的话,我想避免这种情况,而是找到一种方法让 Bazel 抓取 
protoc
 二进制文件并使其可用,以便我可以将其添加到我的 
deps
 规则中的 
cargo_build_script
 中(如果“规则”是正确的词),让我仍然可以根据自己的喜好使用自定义参数等来称呼它。

bazel protoc
1个回答
0
投票
要使

protoc

 在基于 Bazel 的构建中可用而无需手动安装,您可以使用 Bazel 的 
http_archive
 直接在工作区中下载并解压 
protoc
 二进制文件,然后使其在您的 
cargo_build_script
 规则中可用.

以下是您可以尝试的一般方法:

  1. 通过 protoc

    下载 
    http_archive
     二进制文件:
    在您的
    WORKSPACE
     文件中,您可以定义 
    http_archive
     规则来下载适合您平台的预编译 
    protoc
     二进制文件。

    http_archive( name = "protoc", urls = ["https://github.com/protocolbuffers/protobuf/releases/download/v24.1/protoc-24.1-linux-x86_64.zip"], # Make sure to adjust for your platform strip_prefix = "protoc-24.1", )
    根据您想要的 

    urls

     版本和您的平台(例如 Linux、macOS、Windows)调整 
    protoc
     字段。

  2. protoc

    公开为工具链或可执行文件:
    下载后,您可以将其公开为可执行目标,以便您的 build.rs
     可以调用它。在您的 
    BUILD
     文件中,创建一条规则来公开 
    protoc
     二进制文件。

    filegroup( name = "protoc_bin", srcs = ["@protoc//:bin/protoc"], )
    
    
  3. 使 protoc

     在您的 
    cargo_build_script
     规则中可用:
    现在,修改您的
    cargo_build_script
     规则以引用此 
    protoc
     二进制文件并设置 
    PROTOC
     环境变量。

    cargo_build_script( name = "my_build_script", srcs = ["build.rs"], data = [":protoc_bin"], # Make protoc binary available env = { "PROTOC": "$(location :protoc_bin)", }, )
    这将确保 

    build.rs

     脚本可以使用 Bazel 在构建过程中下载的 
    protoc
     二进制文件。

  4. 确保正确的平台处理: 如果您的 CI 管道在多个平台上运行,您需要调整 http_archive

     来为每个平台下载正确的二进制文件。您可以通过在 
    WORKSPACE
     文件中使用特定于平台的逻辑来下载适当的 
    protoc
     二进制文件来完成此操作。

通过使用这种方法,Bazel 将处理获取

protoc

 二进制文件,并且您的 CI 管道将不依赖于预安装它。

© www.soinside.com 2019 - 2024. All rights reserved.