Rust Lang Book Ch.14 Crates.io

Profiles

Cargo有两大主要的profiles:dev和release。

例如,可以在Cargo.toml里自定义:

[profile.dev]
opt-level = 0

[profile.release]
opt-level = 3

  

Publish crate to Crates.io

与一般的两个反斜杠的注释不同,三个反斜杠///就是documentation comments,即用于生成html文档的注释。兼容markdown语法。

示例:

/// Adds one to the number given.
///
/// # Examples
///
/// ```
/// let arg = 5;
/// let answer = my_crate::add_one(arg);
///
/// assert_eq!(6, answer);
/// ```
pub fn add_one(x: i32) -> i32 {
    x + 1
}

  

使用cargo doc之后,会调用rustdoc工具,生成如下文档在target/doc文件夹里:

 

 //!也是文档注释的一种,其文档记录的对象是包含这些//!注释的对象而不是跟在///之后的对象。

比如以下代码在src/lib.rs中:

//! # My Crate
//!
//! `my_crate` is a collection of utilities to make performing certain
//! calculations more convenient.

/// Adds one to the number given.
// --snip--

  

能生成针对包含这些注释的my_crate的文档:

 

 

 

pub fn add_two(x: i32) -> i32 {
//! Adds two to the number given
//! ```
//! let arg = 5;
//! let answer = my_crate::add_two(arg);
//!
//! assert_eq!(7, answer);
//! ```
    x + 2
}

  

生成如下文档

 

 

 

cargo doc --open会立刻构建当前crate和其依赖的crate的文档,并且在浏览器打开。

cargo test时也会测试文档的注释。

常用的Sections:

1. Example

2. Panics: 描述会发生panic的场景

3. Errors: 描述会发生的错误,错误发生的条件,处理错误的建议等

4. Safety: 如果该函数是unsafe的,那就需要解释为什么这个函数是unsafe,并且需要描述其中调用者需要保持住的所有的不变量

 

发布Crate之前的注意事项

1. 如果public API的结构很复杂,比如use my_crate::some_module::another_module::UsefulType,可以通过re-exporting的方式来化简调用格式。pub use my_crate::some_module::another_module::UsefulType

 

 

发布

设置Crates.io账号:

1. 在https://crates.io/me/ 注册并且获取API key

2. cargo login <APIKey>

3. 设置package的name,license, version, author, description, edtion, homepack等信息,如果名称和别的crate重复了,在publish时会有提醒。

4. cargo publish

当有新的版本准备发布时,可以用SemVer的格式来写版本号,然后发布

如果某个版本不应该继续发布时,可以使用cargo yank -vers <版本号> 来让这个版本不能继续被新的项目使用,旧的项目当然不能强制撤掉

cargo yank --vers 1.0.1

cargo yank --vers 1.0.1 --undo #撤销yank

  

Cargo Workspace

为了方便管理,可以用一个workspace来管理一些共享相同Cargo.lock和输出文件夹的packages。在workspace的根目录下,需要放一个Cargo.toml,里面不用[package],而是放[workspace],workspace底下的member是一个包含packages的名称的字符串数组。

 

示例:

Cargo.toml

[workspace]

members = [
    "adder",//a binary package
"add-one",//a library package
"add-two", ]

 

├── Cargo.lock
├── Cargo.toml
├── add-one
│   ├── Cargo.toml
│   └── src
│       └── lib.rs//cargo new add-one --lib
├── adder
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── target

  

在依赖其他库的库中,在dependencies就可以使用相对路径来确认其他被依赖的package的位置:

adder/Cargo.toml

[dependencies]

add-one = { path = "../add-one" }

  

注意在顶层的Cargo.toml加了外部依赖包也没用,要在真正使用的crate对应的Cargo.toml中再次引用一次,不过Cargo会保证每个外部包只下载一次,而且版本尽量兼容。

cargo run和cargo test都可以通过-p来指定要对哪个package进行操作。不过cargo publish没有,必须要进入到要发布的crate的目录下。

 

cargo install

能够下载binary crate到本地,可以当作工具运行。此外,如果binary的名字叫做cargo-sth,那就可以直接运行cargo sth这个指令来调用对应的工具,达到自定义cargo命令的作用。

 

posted @ 2020-10-27 14:57  雪溯  阅读(184)  评论(0编辑  收藏  举报