1

我对 rust 使用库的语法非常陌生。好吧,总的来说,大部分都是新的生锈。

我已经包含了一个未完成的库,并且似乎不起作用。该库称为“小时”,其中lib.rs包含以下内容:

// #[derive(Clone, Debug, PartialEq, Eq)]
pub struct Hours {
    pub rules: Vec<types::RuleSequence>,
    pub tz: Tz,
}

impl Hours {
    pub fn from(s: &str, tz: Tz) -> Result<Self, String> {
        //... abbreviated
    }

    pub fn at(self: &Self, dt: &DateTime<Tz>) -> types::Modifier {
        //... abbreviated
    }
}

它包含在Cargo.toml:相关行:

edition = "2018"

[dependencies]
hours = "0.0.1"

我想知道是否可以包含和使用该from()功能,到目前为止,我没有运气。这是我尝试过的:

use hours;
fn main() {
   //... abbreviated
   let hours = Hours::from(example_hrs, Amsterdam).unwrap();
}

给出编译错误:Hours::from(example_hrs, Amsterdam).unwrap(); ^^^^^ use of undeclared type or moduleHours``

use hours::Hours;
fn main() {
   //... abbreviated
   let hours = Hours::from(example_hrs, Amsterdam).unwrap();
}

给出编译错误:use hours::Hours; ^^^^^^^^^^^^ no ``Hours`` in the root

use hours;
fn main() {
   //... abbreviated
   let hours = hours::Hours::from(example_hrs, Amsterdam).unwrap();
}

给出编译错误:hours::Hours::from(example_hrs, Amsterdam).unwrap(); ^^^^^ could not findHours inhours``

有没有办法包含和使用这个库?我是否需要更改库,或者我只是使用错误?

4

1 回答 1

2

这里的问题是,您共享的存储库链接中的代码与 crates.io 中的依赖项不匹配,Rust 自然无法找到所需的 api 组件。在这种情况下,箱子的所有者尚未在 gitlab 中发布代码。

要查看您可以从docs.rs快速检查源代码。这是所需依赖项 docs.rs/crate/hours/0.0.1/source/的链接。

如果要使用存储库中的当前代码

  • 您可以通过下载(或使用 git clone)在本地拥有它,然后您可以通过指定路径来使用它cargo.toml
  • 或者直接在cargo toml中定义git仓库。
hours = { git = "https://gitlab.com/alantrick/hours.git", rev="7b7d369796c209db7b61db71aa7396f2ec59f942"}

添加修订号或标签可能会有所帮助,因为主分支上的更新可能会破坏兼容性。


为什么 docs.rs 中的这个来源与 crates.io 是准确的?

请检查docs.rs中的about部分:

Docs.rs 使用 Rust 编译器的夜间版本自动构建在 crates.io 上发布的 crates 文档

这意味着它与 crates.io 同步。

为了确保您还可以从本地存储库缓存中检查 crate 的源。

## Note that this path is built with default cargo settings
$HOME/.cargo/registry/src/github.com-1ecc6299db9ec823/hours-0.0.1
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^ github reigstry for crates io 

为什么 crates.io 中 crate 的存储库链接与 crate 的源不匹配

请检查发布箱参考repository信息在包的metadata(in cargo.toml)中指定。

根据包元数据参考,这些信息用于:

这些 URL 指向有关包的更多信息。这些旨在成为相关数据的网络视图,不一定与 VCS 工具等兼容。

documentation = "..."
homepage = "..."
repository = "..."

您也可以查看流行的 crate,它们指向他们的 github(通常)主页,该主页指向 master 分支,而不是当前版本的标签。

于 2020-03-11T13:13:52.353 回答