【问题标题】:Issue when replacing a crates dependency with a local version用本地版本替换 crates 依赖项时的问题
【发布时间】:2015-09-25 21:44:57
【问题描述】:

所以我尝试在这些instructions 之后使用 bincode 序列化一个结构,并且我能够让它工作。

但后来我想用IpAddr 枚举序列化一个结构。由于 IpAddr 没有实现所需的 Encodable 特征,我从 git 下载了 rustc_serialize crate 并为 IpAddr 自己实现了可编码。然后我将我的Cargo.toml 文件更改为:

[dependencies]
# rustc-serialize = "0.3"
byteorder = "0.3"
bincode = "0.4"

[dependencies.rustc-serialize]
path = "src/rustc-serialize-master"

但是现在,我使用的结构中的相同代码无法编译 即使我在结构上方有#[derive(RustcEncodable)],也没有为我的结构实现rustc_serialize::serialize::Encodable。

即使我删除了添加到本地版本 rustc_serialize 的代码,我仍然会收到该错误。

我认为这可能是由于 bincode 和本地 rustc_serialize 交互的方式搞砸了,但我不确定。

【问题讨论】:

  • 对于它的价值,fork rustc-serialize 为另一种类型添加编码可能是个坏主意。为包含 IpAddr 的结构手动实现 Encodable 特征可能更明智。
  • 我试过了,但我得到了一个“只有在当前 crate 中定义的特征才能实现任意类型”的错误。您似乎无法为您未定义的结构(导入的 IpAddr)实现未定义的特征(导入的 rustc-serialize 'encodable` 特征)。如果你能做到这一点,请告诉我。谢谢!
  • 查看How do I implement a trait I don't own for a type I don't own?。包装器类型是正确的解决方案。在您的情况下,您已经有一个包装器类型(serialize a struct with an IpAddr enum)。无论您的结构是什么,您都可以手动实现Encodable。
  • 感谢您的快速回复。所以我一直在尝试实现这一点,但我遇到了一个错误。因此,根据您链接的堆栈溢出,我有 impl Encodable for myStruct { fn encode ..... { match *self { IpAddr(_) => {}, _ => {}, } } } 但即使我已使用 use 明确导入它,我仍然收到 Unresolved enum variant, struct or const 'IpAddr' 错误,并且我在内置类型上也遇到相同的错误。 (P.S. 你怎么能在 cmets 中做代码块?)谢谢!
  • 这只是在这种情况下不需要的一些语法(我也对另一个问题添加了评论)。你想要更接近to this 的东西。另外,你不能在 cmets 中做代码块,因为 cmets 应该很短,可能会被删除。

标签: rust


【解决方案1】:

请查看Cargo documentation on overriding dependencies:

要指定覆盖,请在项目目录的某个祖先目录中创建一个.cargo/config 文件(放置它的常见位置是代码目录的根目录或主目录)。

在那个文件里面,放这个:

paths = ["/path/to/project/rand"]

再深入一点,您可能会遇到issue 22750 - 两个不同版本的 crate 交互会导致无用的错误消息。当您将 rustc-serialize 添加到您的 dependencies 时,您并没有替换旧版本,而是添加一个新版本。

总的来说,这是一个很好的功能。如果我的项目依赖于 crate A 和 B 并且它们都依赖于 crate Z 但版本不同,Rust 可以处理得很好。当他们从这些板条箱中重新出口物品时,就会出现问题。

【讨论】:

  • 仅此一项似乎已经解决了它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
相关资源
最近更新 更多