最近复习鸽了几天,今天继续学,希望在考试之前搞定这个官方文档 もうダメ。。。。
本章学习Cargo和Crates.io相关,内容有下:
- 自定义构建
- 向crates.io提交libraries
- 利用工作空间Workspace组织大型工程
- 从crates.io下载二进制库
- 用自定义命令拓展Cargo
自定义构建
基础
虽然构建方法已经预定义了,但是也可以自定义
Cargo使用两个profile,一个是dev(用在单纯build指令中),一个是release(用在cargo build --release中)。两者都可以通过在Cargo.toml中添加[profile.*]标签自定义:
[profile.dev] opt-level = 0 [profile.release] opt-level = 3
[profile.release]
opt-level = 1 //Override!
这里的opt-level指编译器的优化等级,数值为0-3,数值越高优化越多编译更迟缓运行更高效。
向Crates.io提交Crate
通过三斜杠添加文件注释
通过文件注释让别人明白该如何使用它,生成HTML文档,支持Markdown格式
///#Example
///```
///let arg = 5;
///```
cargo doc 生成这个HTML文档
cargo doc --open 在浏览器中打开你可能需要的文档
文件注释通常包括使用例、引发的错误/Panics与安全性(是否为unsafe)。可根据具体情况添加。
//考完试了,继续摸
你也可以通过 cargo test 来运行注释中的代码块,这些代码将作为测试运行,用来确定例子与源码的更新是否同步。
通过
//! .... //! ....
来完成对整个Crate的总括注释。要注意这些注释一般写进src/lib.rs,在打开doc时直接显示。
通过pub use完善公共API
可以方便用户的使用,不用抽丝剥茧地调用类方法。
使用方法就是在需要使用的方法名前面加上 pub use self::...
举例:
pub use self::kinds::PrimaryColor;
pub mod kinds {
pub fn PrimaryColor(){...}
}
调用时无第一句:
use art::kinds::PrimaryColor;
有
ust art::PrimaryColor;
真正提交自己的Crates:
首先要申请一个账号
注意的是要在 crates.io/me/ 更改API密钥并通过 $ cargo login [pwd] 登录
编辑详细信息(元数据)
文件:Cargo.toml
代码:
[package] name = "Whatever_u_like" //先到先得 version = "0.1.0" authors = ["Your Name <you@example.com>"] edition = "2020" description = "*#>>" license = "?" //许可证 [dependencies]
最后 $cargo publish 提交。同样可以通过这个指令更新。
你可以yank一个版本来阻止用户继续使用它,无论是出于版本老旧还是严重漏洞,但是由于代码实际上不会被删除,要是想删除还是用reset。通过undo来撤销。
$cargo yank --vers 1.0.1 $cargo yank --vers 1.0.1 --undo
使用Workspaces
不同的相关packages组成workspaces
新建一个文件夹,在里面添加文件Cargo.toml:
[workspace] members = [ "adder", ]
然后build,就会得到名为adder的子文件夹,这是新建的package,具有完整的基本结构。同时会新建一个target文件夹,里面是所有源代码的编译后文件。
├── Cargo.lock ├── Cargo.toml ├── adder │ ├── Cargo.toml │ └── src │ └── main.rs └── target
通过修改Cargo.toml和运行Cargo new来在工作空间里面创建新的Librarty Crate,不过要用--lib参数:
cargo new add-one --lib
添加依赖
比如你要在相同的工作区域里将add-one添加为adder的依赖,由于Cargo不默认工作区间的各crate互相依赖,因此要手动在adder的Cargo.toml里添加:
[dependencies] add-one = { path = "../add-one" }
要想添加外部依赖,就要在相应的文件夹里添加Cargo.toml的依赖,最后在父文件夹的Cargo.lock保存相关信息。这样做是保证各个Crate用的是相同版本的外部依赖,但是这个依赖只能在被声明的区间里使用。添加方法:
[dependencies] rand = "0.5.5"
同样你可以添加一个测试,方法没有什么特别的地方。
怎么下载别人的cargo
按官方文档的说法,目前还只能安装有Binary Target的包:
Binary Target:源码可编译为可执行程序
Library Target:自己不能单独运行,可以和其他crate结合。
两个target可以共存的!
下载到那里去了? $PATH/bin 而且它会提示你的
怎么用? 自然地把它当成cargo的指令参数就行了,这些包会成为你有用的工具。
后记
几乎时隔一个月才再次开始Rust的学习,由于自己基础不牢,再看这些不喾天书。可能之后的进一步学习要待写一些代码暖暖手,并掌握相关知识后再行展开吧!感觉现在要是再进行下去的话恐怕自己都不知道自己在说些什么了。。。