如何将Rust库发布为Crates

466 阅读4分钟

所以!让我们经历一下整个过程。编写一些Rust代码来获取当前时间,将其格式化并显示在控制台中,也许可以添加一些功能来猜测两个日期之间有多少时间,并将其作为Crates发布。

目录:

  1. 思考
  2. 代码时间!
  3. 在Crate.io上发布

思考时间(没有双关语的意思)

所以我们想做一个小库,让我们打印当前的系统时间,也许是几种格式。让我们从这么多开始。通过标准库的快速搜索,我们发现...有一些功能!让我们用它写一些代码,看看是否足够。如果还不够,我们将寻找一个可能对我们想做的事情有帮助的外部工具箱,然后从那里开始!

代码时间!

文件:lib.rs

pub mod TimeTools {
    use std::time::SystemTime;

pub fn get_current_time_seconds() {
        let now = SystemTime::now();
        println!("The time now is: {:?}", now);
    }
}

文件:main.rs

use lib::TimeTools;

fn main() {
    TimeTools::get_current_time();
}

文件:Cargo.toml

[package]
name = "opengenus_practice"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html


[lib]
name = "lib"
path = "src/lib.rs"

[dependencies]

如果我们运行这个......我们得到的输出如下:

The time now is: SystemTime { intervals: 132812122436205870 }

这......显然不是我们想要的结果。我们需要更清楚的东西。在google和crate.io中快速查找,我们得到了Chrono crate和time crate,它们都能解决我们的问题。我现在将使用Chrono。为了导入它,我们必须在我们的货物文件中添加它:

// Snip!
[dependencies]
chrono = "0.4.19"

快速检查货物以获得所有的依赖性,我们就可以了。现在,让我们用Chrono来获取和格式化我们的输出:

The time now is: 2021-11-12T14:59:44.736227-03:00

靠近点!有一点太多的额外信息了。让我们来看看是否有办法修剪它。

文件:lib.rs

pub mod TimeTools {
    use chrono::Timelike;

    pub fn get_current_time() {
        let now_time = chrono::Local::now();
        println!(
            "The time now is: {:02}:{:02}:{:02}",
            now_time.hour(),
            now_time.minute(),
            now_time.second()
        );
    }
}

输出是:

The time now is: 15:10:09

这就是我们想要的。好的。实现了当前时间。让我们把日期也打印出来,用一个单独的函数:

pub fn get_current_calendar_date() {
        let now_calendar_date = Utc::now();
        println!(
            "The date today is day: {:02} | month: {:02} | year: {}",
            now_calendar_date.day(),
            now_calendar_date.month(),
            now_calendar_date.year()
        );
    }

输出:(在我住的地方,我们的日期是这样写的,如果你觉得奇怪,请原谅!)

The date today is day: 12 | month: 11 | year: 2021

发布我们的板条箱!

免责声明:由于一个错误,我目前无法访问crates.io的登录界面,因此我无法展示我对上传步骤的个人观点。我已经用几个不同的浏览器和电脑进行了尝试,但没有结果。但我还是会详细介绍所需的步骤和所有重要的细节。巨大的歉意。

在我们考虑发布我们的箱体之前,我们需要记住一些事情。发布是永久性的。它可以通过补丁进行修改,但版本不能被修改,也不能删除/擦除板条箱。然而,对于你发布多少个版本是没有限制的。

说完这些,让我们进入第1步。登录crates.io。你前往他们的网页,在右上方点击用github登录

Crates-1

在我们完成github的登录后,会有一个cargo的登录名,你必须在你的控制台中使用它。

$ cargo login abcdefghijklmnopqrstuvwxyz012345

这样就可以用你的API令牌配置货物。这是个秘密,如果它因任何原因被泄露给任何人,你必须立即改变它。

第二步,准备工作!箱子的名字是以先到先得的方式命名的。意思是说,一旦一个箱子的名字被占用,就不能再使用了。cargo.toml文件是我们的舱单。它有很多你可以配置的选项和信息(我会在参考资料中留下一个链接,以显示可供配置的全部元数据)。请确保在发布前填写以下字段,我引用一下:

  1. 许可证或许可证-文件
  2. 描述
  3. 主页
  4. 文档
  5. 资源库
  6. 阅读手册

包括一些关键字和类别也是一个好主意,尽管它们不是必须的。

第三步,发布!为了打包我们的板块并将其上传到 crates.io,我们将使用cargo publish子命令。这将执行以下步骤:

  1. 对你的软件包进行一些验证检查
  2. 将你的源代码压缩成一个 .crate 文件
  3. 将.crate文件解压到一个临时目录中,并验证其是否能编译
  4. 将.crate文件上传到crates.io
  5. 在添加之前,注册表将对上传的包进行一些额外的检查

我们应该首先运行...

$cargo publish --dry-run
// or..
$cargo package // This is equivalent to the above command.

这将运行上面解释的前3个步骤,确保我们的crate没有错误。你可以(也应该)检查创建的.crate文件,因为目前它的大小有10MB的限制。确保你没有把任何不必要的数据打包进去,比如测试、网站信息、代码生成等等。

Cargo会自动忽略任何在我们使用的任何版本控制系统中指定的被忽略的文件,但如果需要,我们可以在包的元数据中添加更多的exlude = [用逗号分隔的要排除的路径列表 ]

或者你可以反其道而行之,告诉它要包括哪些文件,只需在上述语法中用include替换exlude即可。

最后...我们需要做的就是运行下面的命令,我们的crate就可以发布了

cargo publish

基础知识就这样了。我们的crate的管理是通过cargo来完成的,而不是通过网站界面。我将在参考资料部分留下对这些命令的参考,因为保存这些命令很方便,以防我们忘记它们的用法。

今天就到这里吧!希望你喜欢读这篇文章,再次为缺乏更多的说明性图片表示歉意,目前我还不能做什么。下回见

参考文献

货物手册中的出版箱章节

舱单元数据

货物指令参考