如何在Rust中使用cargo-raze为Bazel生成工作区包BUILD文件
问题原因与解决方案
Cargo Raze 不同生成模式的定位存在明确差异,你遇到的本地工作区包无BUILD文件的情况,是genmode = "Remote"的设计特性,而非配置错误:
- Remote模式仅负责生成远程第三方依赖对应的构建规则,所有生成内容都归集到你配置的
workspace_path指定的目录下,不会扫描、修改本地工作区的代码目录,也不会为本地工作区的成员包生成构建文件。 - 你记忆中可生成本地包构建文件的是
genmode = "Local"模式,该模式会同时扫描本地工作区成员和依赖项,为本地的库、二进制包自动生成对应的BUILD文件。
可选解决方案
方案1:继续使用Remote模式,手动编写本地BUILD文件
Remote模式下本地工作区的构建规则需要自行维护,复杂度很低,示例如下:
foobar-lib/BUILD
load("@rules_rust//rust:defs.bzl", "rust_library") rust_library( name = "foobar-lib", srcs = glob(["src/**/*.rs"]), deps = [ # 远程依赖引用格式:@[gen_workspace_prefix]//:[依赖名] # 例:@remote_cargo_workspace//:serde ], )
foobar-bin/BUILD
load("@rules_rust//rust:defs.bzl", "rust_binary") rust_binary( name = "foobar-bin", srcs = glob(["src/**/*.rs"]), deps = [ "//foobar-lib", # 其他远程依赖同上格式引用 ], )
方案2:切换到Local模式实现自动生成
修改工作区根目录Cargo.toml的raze配置,将genmode = "Remote"改为genmode = "Local",调整workspace_path适配本地路径后重新执行raze,即可在各个工作区成员目录下自动生成对应的BUILD文件。
额外建议
目前Cargo Raze已经停止官方维护,rules_rust原生提供的crates_repository规则对工作区、第三方依赖的管理更简便,无需额外依赖raze工具,可作为替代方案使用。
内容的提问来源于stack exchange,提问作者Chetan Bhasin
相关产品推荐
相关产品推荐

