选择性模型库
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 会抱怨有冲突。
我怎样才能让依赖于功能的板条箱使用另一个版本的相同板条箱,如下所示
[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 会抱怨有冲突。