我无法在 Linux(Ubuntu 18 Bionic Beaver)上编译以下内容。我已经尝试过 Docker 和 VirtualBox VM,但rustc
最终都耗尽了内存。该代码在 macOS 上编译没有问题,直到大约 5 天前才在 Linux 上编译。
use {
actix_web::{
get,
web::{self},
App, HttpResponse, HttpServer,
},
mongodb::{
options::{ClientOptions, StreamAddress},
Client, Database,
},
};
#[actix_rt::main]
async fn main() -> std::io::Result<()> {
let options = ClientOptions::builder()
.hosts(vec![StreamAddress {
hostname: "localhost".into(),
port: Some(27017),
}])
.build();
let client = Client::with_options(options).unwrap();
HttpServer::new(move || {
App::new()
.data(AppState {
db: client.database("mydb"),
})
.service(hi)
})
.bind("localhost:3000")
.unwrap()
.run()
.await;
Ok(())
}
#[get("/hi")]
async fn hi(state: web::Data<AppState>) -> actix_web::Result<HttpResponse> {
state.db.collection("mycoll").find(None, None).await;
HttpResponse::Ok().await
}
struct AppState {
db: Database,
}
Cargo.toml 中的依赖项:
[dependencies]
actix-rt = "1.1.1"
actix-web = "2.0.0"
mongodb = "1.1.0"
在最后一个成功的 CI 构建和第一个开始失败的 CI 构建之间唯一改变的是向服务器添加一个端点(本质上是现有端点的复制/粘贴),以及时间箱上的一个小版本碰撞(间接依赖)。检查最后一个工作提交并尝试构建它不起作用。
如果我删除await
on调用,它将在 Linux 上编译,但如果我将该调用(带有)放在非 Actix 中find()
,它也会编译。find
await
async fn
如果我使用sync
mongo 的功能,它也可以工作,这并不理想。
降级到 Rust 1.45 允许它编译,所以显然 1.46 版本中的某些东西以某种方式破坏了 actix 或 mongo crate。
因为这段代码在 macOS 上运行,并且上周在 Linux 上运行,所以我假设在这样的 Actix-web 路由处理程序中使用 Mongo 没有根本问题。我错过了什么吗?