gpt4 book ai didi

rust - 如何从单独的 cargo 工作区 github 存储库中导出特征

转载 作者:行者123 更新时间:2023-12-03 11:31:16 24 4
gpt4 key购买 nike

我对 rust 还很陌生,正在尝试了解如何最好地创建可重用的共享库组件。我有一个名为 的 github 存储库 rust 库 即设置为 cargo 工作区。此 repo 的项目树如下所示:

├── Cargo.lock
├── Cargo.toml
├── describable
│ ├── Cargo.toml
│ └── src
│ ├── describable.rs
│ └── lib.rs
└── health_check
├── Cargo.toml
└── src
├── health_check.rs
└── lib.rs
顶级 Cargo.toml 文件包含:
[workspace]
members = [
"describable",
"health_check"
]
Cargo.toml 每个成员中的文件只定义该成员的依赖关系及其版本 - 例如 可描述/Cargo.toml :
[package]
name = "lib_describable"
version = "1.0.0"
authors = ["my-name <me@email.com>"]
edition = "2018"

[lib]
name = "lib_describable"
path = "src/lib.rs"
健康检查/Cargo.toml :
[package]
name = "lib_health_check"
version = "1.0.0"
authors = ["my-name <me@email.com>"]
edition = "2018"

[dependencies]
lib_describable = { path = "../describable" }

[lib]
name = "lib_health_check"
path = "src/lib.rs"
请注意,我用 命名库。库_ 前缀只是为了避免与其他 rust 库发生任何冲突。
lib.rs 每个工作区成员中的文件只定义了我要导出的公共(public)模块 - 例如 可描述/src/lib.rs :
pub mod describable;
对此的实现在 可描述/src/describable.rs :
pub trait Describable {
fn describe(&self) -> String;
}
中的实现健康检查/src/健康检查.rs 是:
use lib_describable::describable::Describable;

pub trait HealthCheckable: Describable {
fn check_health(&mut self) -> Result<(), String>;
}
在对特定成员进行任何更改时,我总是在其 中更新其版本号Cargo.toml 文件。 CircleCI 用于自动构建这个 repo。如果构建成功,则 CircleCI 作业使用多个 git 标签(工作区中的每个成员一个)标记此 repo,这些标签的格式为 <member-name>_<member-version-from-its-cargo-toml>_<git-short-commit-sha> ,例如对于上述两个成员,它可能会使用以下标签标记构建:
describable_1.0.0_d2db9ff
health_check_1.0.0_d2db9ff
然后我有一个单独的 git 存储库,其中包含一个使用这些共享库成员构建的 rust 二进制文件。该项目在其 中引用了共享库成员。配置.toml 如下:
...
[dependencies]
...
lib_describable = { git = "ssh://git@github.com/xxx/rust-libs.git", tag = "describable_1.0.0_d2db9ff" }
lib_health_check = { git = "ssh://git@github.com/xxx/rust-libs.git", tag = "health_check_1.0.0_d2db9ff" }
...
[[bin]]
name = "my-app"
path = "src/bin/main.rs"
xxx 只是我的 github 帐户的混淆名称。文件 src/bin/main.rs 在这个项目中包含以下形式的代码:
extern crate lib_describable;
extern crate lib_health_check;

use lib_describable::describable::Describable;
use lib_health_check::health_check::HealthCheckable;

pub trait MyDb: Describable + HealthCheckable {
// some functions defined here that are not important for this issue
}

pub struct MySpecialDb { ... }

impl Describable for MySpecialDb {
fn describe(&self) -> String {
// returns a description of this DB
}
}

impl HealthCheckable for MySpecialDb {
fn check_health(&mut self) -> Result<(), String> {
// performs some health check specific to this DB and returns either Ok(()) if its healthy or Err("...some error message...") if it is unhealthy
}
}

impl MyDb for MySpecialDb { ... }
我发现的问题是 rust 编译器似乎不喜欢 行。 impl HealthCheckable for MySpecialDb 并报告表单错误:
the trait bound `...::MySpecialDb: lib_describable::describable::Describable` is not satisfied

the trait `lib_describable::describable::Describable` is not implemented for `...::MySpecialDb`

note: perhaps two different versions of crate `lib_describable` are being used?rustc(E0277)
有什么明显的地方我做错了导致这个错误吗?

最佳答案

不幸的是,这似乎不是 Cargo 中受支持的配置,从我在这里提出的问题得到的回复中可以看出:https://github.com/rust-lang/cargo/issues/8956
因此,我已将我的 Cargo 工作区 repo 转换为 Cargo lib repo,其中我的所有库现在共享一个版本。

关于rust - 如何从单独的 cargo 工作区 github 存储库中导出特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65174433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com