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
中(如果“规则”是正确的词),让我仍然可以根据自己的喜好使用自定义参数等来称呼它。
protoc
在基于 Bazel 的构建中可用而无需手动安装,您可以使用 Bazel 的
http_archive
直接在工作区中下载并解压
protoc
二进制文件,然后使其在您的
cargo_build_script
规则中可用.以下是您可以尝试的一般方法:
通过 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
字段。
将 protoc
公开为工具链或可执行文件:下载后,您可以将其公开为可执行目标,以便您的
build.rs
可以调用它。在您的
BUILD
文件中,创建一条规则来公开
protoc
二进制文件。
filegroup(
name = "protoc_bin",
srcs = ["@protoc//:bin/protoc"],
)
使 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
二进制文件。
确保正确的平台处理:
如果您的 CI 管道在多个平台上运行,您需要调整 http_archive
来为每个平台下载正确的二进制文件。您可以通过在
WORKSPACE
文件中使用特定于平台的逻辑来下载适当的
protoc
二进制文件来完成此操作。
protoc
二进制文件,并且您的 CI 管道将不依赖于预安装它。