- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
前言:我相当确定这应该很容易弄清楚,但我没有任何运气。实际上,我一直在与 Cargo 管理器作斗争,我一直希望它像 C
中的一个简单的 include
语句一样,但它当然不是这样简单的。如果您对总体上如何更好地构建此项目有任何意见,请分享。
假设我有一个用 Cargo 管理的 Rust 库。该箱名为 point
,目录如下所示。
point/
├── Cargo.lock
├── Cargo.toml
├── src
└── lib.rs
这个箱子没有依赖关系。
现在,我已经构建了另一个库,它将使用这个point
crate。这个库叫做 sat
这个库看起来像这样:
sat/
├── Cargo.lock
├── Cargo.toml
├── src
├── circle.rs
├── lib.rs
├── point/
└── polygon.rs
注意point/
就是上面说的point目录。我之所以将 point
作为一个单独的库,而不是作为 sat
中的一个模块,是因为 circle
和 polygon
模块依赖于 point
(我想不出一种方法让 point
在 sat
中作为一个模块工作而无需重复代码. 这与问题并不真正相关,但与惯用的 Rust 库结构相关,所以请随意评论更好的设置方法)。
这是 sat/
的 Cargo.toml
文件
$ cat sat/Cargo.toml
[package]
name = "sat"
version = "0.1.0"
[dependencies]
point = { path = "src/point" }
现在,这一切都很好。但是,假设我想创建一个使用 sat
作为外部包装箱的应用程序。 如何在不包含 point
库本身的情况下访问此应用程序中的 point
库?
这是一个例子,point
库中有一个名为Point
的结构。 sat
库中有一个名为 Circle
的结构。假设我的示例源代码如下所示:
$ cat src/main.rs
extern crate sat;
// I don't want to have to include the point crate because it is already
// included in sat
// extern crate point;
fn main() {
// declare a polygon
// structure is: crate::module::struct::staticFunction
let polygon = sat::polygon::Polygon::new( <parameters> );
// I cannot declare a Point, because point is not a module in sat
// this errors out.
// However, this is the sort of thing that I would like to do.
let point = sat::point::Point::new( <parameters> );
}
最佳答案
I don't want to have to include the
point
crate because it is already included insat
(强调我的)
这实际上没有任何意义。您使用的 crate 版本完全有可能(和所需的功能)是依赖项正在使用的 crate 的不同版本。这允许您在依赖项尚未更新时使用较新版本的功能(反之亦然)。这可以防止一种特定类型的“依赖 hell ”。
不幸的是,它引入了另一种依赖 hell ,其中 crate A 的公共(public)接口(interface)暴露了 crate B(版本 1)的类型,我们试图将 crate A 的公共(public)接口(interface)与 crate B 一起使用(版本 2)。这会产生一系列令人困惑的错误,例如“预期的 Foo
,找到的 Foo
”。这些消息正在 actively worked on .
要认识到的关键是,通过在您的公共(public) API 中放置外部类型,您的公共(public) API 现在会受到外部类型的影响。这意味着当外部 crate 更新版本时,您需要更新您的版本以维护语义版本控制!
后一种情况是您尝试选择加入的情况。
你有两个选择:
第一个看起来像这样:
指向/src/lib.rs
pub struct Point(pub u8, pub u8);
sat/src/lib.rs
extern crate point;
pub use point::Point;
pub struct Circle(pub point::Point);
app/src/main.rs
extern crate sat;
use sat::{Point, Circle};
fn main() {
let p = Point(0, 0);
let c = Circle(p);
}
这可能是最接近您要查找的内容。否则,您需要显式地将依赖包添加到 sat
和 app
中。这并非闻所未闻,大多数使用 hyper
的 crate 都做同样的事情。
The reason I included point as a separate library, instead of as a module within sat, is that both the
circle
andpolygon
modules depend onpoint
. I couldn't figure out a way to getpoint
to work as a module insat
without repeating code.
你或许应该明白这一点。 Crates 很棒,当你有一段可重用的代码时,你当然应该使用它们,但它们不是重用代码的唯一方式:
pub mod point {
pub struct Point(pub u8, pub u8);
}
pub mod square {
use point::Point;
pub struct Square(pub Point, pub Point);
}
pub mod circle {
use point::Point;
pub struct Circle(pub Point);
}
fn main() {
let c = circle::Circle(point::Point(0, 0));
let s = square::Square(point::Point(0, 0), point::Point(1, 1));
}
关于rust - 使用 Cargo 使较低级别的 crate 在顶部可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37244888/
我正在将 parking_lot 添加到我的项目中,我希望我的依赖项也可以选择使用它来使用它。 例如,我知道 Tokio 有一个启用 parking_lot 的功能标志,但我想找到所有具有相似功能标志
我想使用 dijkstra来自 pathfinding crate 的函数: pub fn dijkstra( start: &N, neighbours: FN, succe
我有一个 Rust 项目,它在一个工作区中分为多个 crate 。其中一个 crate 是一个测试 crate,它包含用于其他 crate 中的单元和集成测试的实用程序。 在一个 crate 中,我定
此测试代码(playpen): use std::fmt::{Display, Formatter, Error}; struct MyLocalType; type MyResult = Resul
我不小心将我的私有(private)箱子发布到了 crates.io。我该如何删除它?我检查了 documentation但似乎没有办法删除已发布的 crate 。 最佳答案 预防 为避免将来出现这种
有什么比将所有内容都放在同一个模块中更好的方法吗? sub_module.rs pub struct GiantStruct { /* */ } impl GiantStruct { // t
我正在使用Cargo::Ops::Compile()函数使用Cargo::Ops::Compile()函数构建铁锈项目。我在一个json文件中也有一个定制目标。。如何使用目标文件将项目构建到正确目标?
使用hyper crate,我向端点发出了HTTP请求,然后尝试将响应主体传递给期望参数为Futures crate Stream的第三方库。 这导致类型错误。 Cargo.toml [depende
在示例中,hs 从 std 重新导出 HashSet。但它编译时没有错误或警告。为什么? #![no_std] pub use hs::HashSet; pub fn new() -> HashSet
在阅读官方书籍时,我偶然发现了包裹和 crate 。要创建一个新的“项目”,这就是我运行的: $ cargo new my-project Created binary (applicati
在示例中,hs 从 std 重新导出 HashSet。但它编译时没有错误或警告。为什么? #![no_std] pub use hs::HashSet; pub fn new() -> HashSet
我正在尝试编写一些调试辅助宏。所以我创建了一个 crate 来容纳所有这些,并使用 phase(plugin) 在外部引用该 crate : #[cfg(test)] #[phase(plugin)]
每次我看到这样的错误: error: associated constants are experimental (see issue #29646) ... = help: add #![featu
我对 crates.io 上托管的确切内容有点困惑(“ crate ”是指代这些内容的正确方式吗)?我的理解是 crate 是 Rust 中的一个编译单元,但是 crates 和 crates.io
我今天开始学习 Rust,但我卡在了 this step .我想在我的项目中使用 rand crate,所以我按照教程中的建议更新了我的 Cargo.toml: [package] name = "g
我有一个包含大量代码的箱子,所以我将其拆分为多个文件/模块。然而,一些模块有内部不安全的东西(例如原始指针),我需要向不同的模块公开,但我不想暴露给我的 crate 的用户。我该怎么做? 我能想到的唯
我有一个包含大量代码的箱子,所以我将其拆分为多个文件/模块。然而,一些模块有内部不安全的东西(例如原始指针),我需要向不同的模块公开,但我不想暴露给我的 crate 的用户。我该怎么做? 我能想到的唯
Rust 文档中讨论 patching 的部分解释了如何实现补丁,但它使用的所有示例都是为了“测试”和短期修复。我想做的是为我依赖的其中一个 crate 打一个补丁,它会增加它的子依赖性,然后我想在
This question already has answers here: Unable to read file contents to string - Result does not imp
我正在尝试在 Rust 中创建一个模块,然后从不同的文件中使用它。这是我的文件结构: matthias@X1:~/projects/bitter-oyster$ tree . ├── Cargo.lo
我是一名优秀的程序员,十分优秀!