我应该如何使用依赖项的依赖项?

Pet*_*ght 6 rust rust-cargo

我正在使用扭曲进行项目。Warp 包含字节货物作为依赖项,我想使用传递到回调中的字节结构。这是一个例子:

use warp::Filter;

fn process(data: bytes::Bytes) -> impl warp::reply::Reply {
    println!("{:?}", data);
    "processed!"
}

#[tokio::main]
async fn main() {
    let process = warp::path("process")
        .and(warp::post())
        .and(warp::body::bytes())
        .map(process);

    warp::serve(process)
        .run(([127, 0, 0, 1], 3030))
        .await;
}
Run Code Online (Sandbox Code Playgroud)

这是我的 Cargo.toml 中的依赖项:

[dependencies]
bytes = "*"
tokio = { version = "0.2", features = ["full"] }
warp = "0.2"
Run Code Online (Sandbox Code Playgroud)

这个设置给了我这个错误:

error[E0631]: type mismatch in function arguments
  --> src/main.rs:13:14
   |
3  | fn process(data: bytes::Bytes) -> impl warp::reply::Reply {
   | --------------------------------------------------------- found signature of `fn(bytes::bytes::Bytes) -> _`
...
13 |         .map(process);
   |              ^^^^^^^ expected signature of `fn(bytes::bytes::Bytes) -> _`
   |
   = note: required because of the requirements on the impl of `warp::generic::Func<(bytes::bytes::Bytes,)>` for `fn(bytes::bytes::Bytes) -> impl warp::reply::Reply {process}`

Run Code Online (Sandbox Code Playgroud)

不太喜欢这个错误消息,因为它告诉我它正在寻找签名fn(bytes::bytes::Bytes) -> _,并且发现fn(bytes::bytes::Bytes) -> _它对我来说看起来几乎完全相同,但经过一番搜索后我意识到这是因为有两个不同版本的字节被拉入,所以我这样调整 Cargo.toml :

bytes = "0.5.6"
Run Code Online (Sandbox Code Playgroud)

所以我得到了与 warp 拉入的字节相同的版本。

这是处理这个问题的传统方法吗?

小智 -1

看来,您遇到的问题源于 Rust 的 Cargo 依赖管理系统导致的类型不兼容,引入了两个不同版本的字节库。当您在 Cargo.toml 中指定 bytes = "*" 时,Cargo 会尝试获取最新版本的 bytes 库。但是,warp 可能依赖于特定版本的字节库。

解决此差异的标准方法是确保您的项目及其依赖项保持一致以使用相同版本的库。您可以通过检查 Cargo.lock 文件或直接检查您所依赖的库的 Cargo.toml 来确定所使用的确切版本。

例如,如果您确定 warp 使用 0.5.6 版本的字节,则应谨慎地在 Cargo.toml 中指定确切的版本,以保持一致性并避免类型不匹配。