选择性模型库

Selective model lib

我怎样才能让依赖于功能的板条箱使用另一个版本的相同板条箱,如下所示

[features]
serde_1 = ["dep_serde_1"]
serde_1_0_133 = ["dep_serde_1_0_133"]

[dependencies]
dep_serde_1 = { package = "serde", version = "1.0.0", optional = true}
dep_serde_1_0_133 = { package = "serde", version = "1.0.133", optional = true}

我的问题是编译器强制我使用

use dep_serde_1::*;

除了这个

use serde::*;

我只是在代码中启用其中一个 cfg(feature = serde_1) 我将选择必须编译的代码

抱歉我的英语不好

[编辑]

主要思想驱动形成这个问题,例如 如果我的模型使用 actix-0.10 而另一个使用我的库的板条箱使用 actix-0.12 它会生成编译器错误

我不太确定我明白你想要什么。如果你希望 crate 的名称在你的 use 语句中是 serde,你可以将它们重命名回来:

#[cfg(feature = "dep_serde_1")]
extern crate dep_serde_1 as serde;
#[cfg(feature = "dep_serde_1_0_133")]
extern crate dep_serde_1_0_133 as serde;

// Now you can
use serde::*;

[编辑:]以上介绍了您对 serde 的使用,但 serde_derive 有其自己的想法。当你定义一个像

这样的结构时
#[derive(Serialize)]
struct Asdf { /* … */ }

serde 生成的代码大致如下所示:

const _: () = {
    extern crate serde as _serde;
    #[automatically_derived]
    impl _serde::Serialize for Asdf { /* …

即它忽略了 serde crate 的重命名并尝试使用它的原始名称。

您可以使用 crate 容器属性覆盖此行为:

#[derive(Serialize)]
#[serde(crate = "serde")]
struct Asdf { /* … */ }

这将使生成的代码使用来自外部命名空间的 serde:

const _: () = {
    use serde as _serde;
    #[automatically_derived]
    impl serde::Serialize for Asdf {

请注意,相互排斥的特征是 not a good idea。如果可以,最好将一个设置为默认设置,另一个覆盖它。

我也不确定您的货物依赖项是否确实按照您的意愿进行。 Cargo 不允许依赖一个 crate 两次,如果我强制 dep_serde_1=1.0.0 cargo 会抱怨有冲突。