我如何通过板条箱功能有条件地依赖不同版本的依赖项,但又像使用单个依赖项一样使用它?

问题描述 投票:0回答:1

如何定义一个依赖于具有如下功能的同一板条箱的不同版本的板条箱?

[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
它将生成编译器错误。

rust dependencies rust-cargo conditional-compilation
1个回答
2
投票

我不太确定我明白你想要什么。如果您希望在 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
容器属性覆盖此行为:

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

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

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

请注意,互斥的功能不是一个好主意。如果可以的话,最好将其中一个设置为默认值,然后将另一个覆盖它。

我也不确定您的货物依赖项实际上是否按照您希望的方式进行。货物不允许依赖一个板条箱两次,如果我强制

dep_serde_1
=1.0.0
货物会抱怨存在冲突。

© www.soinside.com 2019 - 2024. All rights reserved.