使用Bazel编译Rocket

5
我正在尝试制作以下方案的工作原型:
- 语言:Rust(rustc 1.45.0-nightly (ad4bc3323 2020-06-01)) - 框架:Rocket v0.4.4 - 构建工具:Bazel - 平台:Mac OS X / Darwin x64
运行 bazel build //web-api 将导致以下错误。根据查看 Cargo.lock 文件,我认为这是因为 Rocket 对 hyper 库的依赖指定了对 log 0.3.9 库的依赖。出于某种原因,它没有使用更新的 log=0.4.x。话虽如此,我不知道为什么会拉取这个库,因为如果我手动构建它,它就可以正常工作。
ERROR: /private/var/tmp/_bazel_nathanielford/2a39169ea9f6eb02fe788b12f9eae88f/external/raze__log__0_3_9/BUILD.bazel:27:1: error executing shell command: '/bin/bash -c CARGO_MANIFEST_DIR=$(pwd)/external/raze__log__0_3_9 external/rust_darwin_x86_64/bin/rustc "$@" --remap-path-prefix="$(pwd)"=__bazel_redacted_pwd  external/raze__log__0_3_9/src/lib.rs -...' failed (Exit 1) bash failed: error executing command /bin/bash -c 'CARGO_MANIFEST_DIR=$(pwd)/external/raze__log__0_3_9 external/rust_darwin_x86_64/bin/rustc "$@" --remap-path-prefix="$(pwd)"=__bazel_redacted_pwd' '' external/raze__log__0_3_9/src/lib.rs ... (remaining 24 argument(s) skipped)

Use --sandbox_debug to see verbose messages from the sandbox
error[E0425]: cannot find function `set_logger` in crate `log`
   --> external/raze__log__0_3_9/src/lib.rs:731:16
    |
731 |     match log::set_logger(&ADAPTOR) {
    |                ^^^^^^^^^^ not found in `log`
    |
help: consider importing this function
    |
204 | use set_logger;
    |

以下是我的目录结构:
/
|-WORKSPACE
|-BUILD      # Empty
|-web-api/
| |-BUILD
| |-src/
| | |-main.rs
| |-cargo/
|   |-Cargo.toml
|   |-Cargo.lock
|   |-BUILD.bazel
|   |-remote/
|     |-... (Cargo-raze files)

为了设置 cargo-raze,我按照 github页面 上的说明进行了以下步骤。
$ cd web-api/cargo
$ cargo generate-lockfile  
$ cargo vendor --versioned-dirs --locked
$ cargo raze

generate-lockfile负责生成Cargo.lock文件,而cargo raze则负责生成BUILD.bazel文件和remote子目录中的所有内容。

然后,为了执行bazel build,我返回到根目录并运行bazel build //web-api,但会出现上述错误。

下面是我的WORKSPACE文件:

workspace(name = "rocket-bazel")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "io_bazel_rules_rust",
    sha256 = "f21c67fc2fef9d57fa3c81fde1defd9e57d451883388c0a469ec1c470fd30dcb",
    strip_prefix = "rules_rust-master",
    urls = [
        "https://github.com/bazelbuild/rules_rust/archive/master.tar.gz"
    ],
)

http_archive(
    name = "bazel_skylib",
    sha256 = "9a737999532daca978a158f94e77e9af6a6a169709c0cee274f0a4c3359519bd",
    strip_prefix = "bazel-skylib-1.0.0",
    url = "https://github.com/bazelbuild/bazel-skylib/archive/1.0.0.tar.gz",
)

load("@io_bazel_rules_rust//rust:repositories.bzl", "rust_repositories")
rust_repositories(version="nightly", iso_date="2020-06-02")

load("@io_bazel_rules_rust//:workspace.bzl", "bazel_version")
bazel_version(name = "bazel_version")

load("//web-api/cargo:crates.bzl", "raze_fetch_remote_crates")
raze_fetch_remote_crates()

这是我的web-api/BUILD文件:
load("@io_bazel_rules_rust//rust:rust.bzl", "rust_binary")

rust_binary(
    name = "web-api",
    srcs = ["src/main.rs"],
    deps = [
        "//web-api/cargo:rocket",
    ],
)

以下是我的web-api/cargo/Cargo.toml文件内容:

load("@io_bazel_rules_rust//rust:rust.bzl", "rust_binary")

rust_binary(
    name = "web-api",
    srcs = ["src/main.rs"],
    deps = [
        "//web-api/cargo:rocket",
    ],
)

我已经没有任何尝试的想法了。我可以使用 Rust 进行编译(尽管文件显然放置在稍微不同的位置),但是无法通过 Bazel 编译成功,即使在 Docker 容器内运行也不行。我认为存在某些编译目标不匹配或夜间构建设置不正确的问题,但我不确定如何诊断或解决它。
这里有一个包含我尝试的文件/结构的存储库链接:https://github.com/nathanielford/bazel-rust-build

2
不确定是否有意义(或是否可能)将整个“项目”目录推送到GitHub上的存储库中,以便帮助你的人在尝试理解你遇到的问题时更容易进入。 - draganstankovic
2
@draganstankovic 我已经将MVE发布到Github,并添加了一个链接到问题。希望这能阐明问题! - Nathaniel Ford
1个回答

3
我曾经遇到过一个类似的问题,当我使用rust和log crate以及env_logger crate创建了一个最小化的Bazel工作区时。如果你在没有features = ["std"] 的情况下编译,你也会遇到这样的问题。然后我尝试在依赖logCargo.toml中启用它,但没有成功。
我的解决方法是,在[raze]下的Cargo.toml中添加:
default_gen_buildrs = true

我发现当在生成的log crate中未设置default_gen_buildrs标志时,BUILD.bazel文件中没有cargo_build_script定义,或者是以下情况:

crate_features = [
      "std",
    ],

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接