rust - 在 Bazel 中编译 Rocket

标签 rust bazel rust-rocket

我正在尝试获得以下场景的工作原型(prototype):

  • 语言: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 的依赖library 指定了对 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 page 的说明做了以下操作.:
    $ cd web-api/cargo
    $ cargo generate-lockfile  
    $ cargo vendor --versioned-dirs --locked
    $ cargo raze
    

    (generate-lockfile 创建了 Cargo.lock 文件,cargo raze 创建了 BUILD.bazel 文件和 remote 子目录的所有内容。)

    然后执行 bazel 构建,我回到根目录并运行 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",
        ],
    )
    

    我已经没有关于尝试什么的想法了。我可以在没有 Bazel 的情况下编译它,只需使用 rust(尽管显然文件位于稍微不同的位置)。我可以让它在 Docker 容器中编译。我只是无法让 Bazel(必须使用 cargo raze,无论是在供应商模式还是远程模式下)成功运行:我认为编译目标或夜间构建存在一些不匹配,但没有正确设置 - 但我不是确定如何诊断或克服它。

    这是 link to a repository使用我尝试过的文件/结构。

    最佳答案

    当我用 rust 和 log crate 以及 env_logger crate 制作一个最小的 Bazel 工作区时,我遇到了类似的问题。当您尝试在没有 features = ["std"] 的情况下进行编译时,我发现了类似的问题。然后我尝试在 Cargo.toml 中启用它关于日志依赖没有成功。
    我的解决方案是在 Cargo.toml[raze] 下我补充说:

    default_gen_buildrs = true
    
    我可以追溯到 default_gen_buildrs未在生成的日志箱中设置标志 BUILD.bazel文件没有 cargo_build_script 定义或者这个:
    crate_features = [
          "std",
        ],
    

    关于rust - 在 Bazel 中编译 Rocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62252327/

    相关文章:

    bazel - 为什么 bazel 比 gradle 快

    java - 从 Skylark 规则访问 maven_jar.artifact 的值

    rust - 火箭不解析 URL 中的 RawStr 以匹配路由

    json - JSON响应的反序列化在字符串中保留引号

    Rust 如何在某些结构的静态函数调用中解析类型注释

    rust - 如何确定 Rust 迭代器的结果类型?

    c - 使用Clang将C++库编译为wasm失败,找不到 'stdlib.h'文件错误

    rust - 什么是最有效的: a reference to an ArrayBase or an ArrayView?

    android - 为 Tensorflow 编译 Android 示例

    rust - 火箭有像Flask的蓝图一样的东西吗?