我正在尝试获得以下场景的工作原型:
- 语言:锈 (
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)
为了设置,我按照github 页面cargo-raze
的说明进行了以下操作:
$ cd web-api/cargo
$ cargo generate-lockfile
$ cargo vendor --versioned-dirs --locked
$ cargo raze
(generate-lockfile
创建Cargo.lock
文件,cargo raze
创建文件和子目录BUILD.bazel
的所有内容。)remote
然后为了执行 bazel 构建,我回到 root 并运行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,无论是在供应商模式还是远程模式下)成功运行:我认为编译目标或夜间构建存在一些不匹配,但没有正确设置 - 但我不是确定如何诊断或克服它。
这是一个包含我尝试过的文件/结构的存储库的链接。