如何在Rust 2018中使用成语地为一个crate创建别名?

27

我有一个木箱 foo_sys。在 Rust 2015 版本中,为了方便起见,我使用 extern crate foo_sys as foo,但是在 Rust 2018 版本中,不再需要使用 extern crate,而且我不想仅仅为了别名而使用它。当去掉 extern crate 后,我会得到以下错误:

错误[E0463]:找不到 foo 的木箱

2个回答

52
这可以通过 Cargo 的 rename-dependency 功能实现,该功能在 Rust 1.31 及以上版本中可用。使用此功能,可以为依赖项提供一个包属性:

重命名依赖项 功能允许您以不同于源名称的名称导入依赖项。这在以下几种情况下很有用:

  • 从不同的注册表中依赖相同名称的包。
  • 依赖多个版本的包。
  • 避免需要在 Rust 源代码中使用 extern crate foo as bar

与其编写:

[dependencies]
foo_sys = "0.2"

可以在Cargo.toml的依赖项中添加package键:

[dependencies]
foo = { package = "foo_sys", version = "0.2" }

警告: 当使用此功能时,Rust 1.26.0之前的 Cargo 可能会下载错误的依赖项!


12

惯用的解决方法是在 Cargo.toml 中重新命名箱子。有关更多信息,请参见 Tim Diekmann的答案

但是,如果您出于某种原因不想使用 Cargo.toml 重命名,则仍然可以使用旧语法。它已被软弱地弃用,但尚未删除。因此,这仍然有效:

extern crate foo_sys as foo;

(Playground示例)


截至2023年底,这是重命名从工作区继承的crate的唯一方法:https://github.com/rust-lang/cargo/issues/12546 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接