自定义构建

我们通过release profile来自定义构建

release profile

  • 是可预定义的
  • 可自定义:可以使用不同的配置,对代码编译拥有更多的控制
  • 每个profile的配置都独立于其他的profile

cargo中主要有两个profile:

  1. Dev profile:适用于开发cargo build
  2. Release profile:适用于发布,cargo build --release

自定义profile

Cargo.toml 里添加[profile.dev]区域,可以覆盖默认配置

  1. //Cargo.toml
  2. [package]
  3. name = "minigrep"
  4. version = "0.1.0"
  5. edition = "2018"
  6. # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
  7. [dependencies]
  8. // 自定义profile
  9. [profile.dev]
  10. opt-level = 0
  11. [profile.release]
  12. opt-level = 3

opt-level:在Rust编译的时候对代码执行哪种程度的优化,通常发布版本的时候做到最大的优化 值越大优化越大,相对应也会有更长的编译时间

更多配置项查看官方文档: https://doc.rust-lang.org/cargo/

发布Crate

生成文档

  1. 文档注释通过三斜杠///完成
  2. 运行命令cargo doc --open生成文档,并且在浏览器中打开文档
  3. 常用章节
    1. Example:使用的例子
    2. Paincs:函数可能会发生panic的场景
    3. Errors:函数返回Result,描述可能的错误种类,以及导致错误的原因
    4. Safety:如果函数处于unsafe调用,就要解释函数unsafe的原因
      1. /// 这是一个文档注释,支持md格式
      2. ///
      3. /// # Example (章节,除了Example之外还有上面的常用章节)
      4. ///
      /// let n = 32; /// let c = get_fn_name(); /// ```
<a name="yY1qC"></a>
### 文档注释作为测试
注释中的示例代码块(Example),**可以用作测试用例**

<a name="ObkyA"></a>
### pub use导出
避免层层嵌套的导入方式。
```rust
// lib.rs
pub use self::kind::PrimaryColor;

// main.rs
use art::kinds::PrimaryColor; //没有使用pub use之前需要这样导入

use art::PrimaryColor; // 使用pub use之后就可以直接这样导入,避免嵌套


fn main(){
    let red = PrimaryColor::Red;
}

工作空间

为什么需要工作空间?
当一个项目变得很复杂的时候,往往会产生很多文件,这时候为了方便管理就需要来给各个不同职责的文件分配工作空间。

创建工作空间

有多种方式来组件工作空间
来举一个例子:
1个二进制crate,2个库crate

  • 二进制crate:main函数,依赖于其他两个库crate(adder文件夹)
  • 一个库crate提供add_one函数(add_one文件夹)
  • 另外一个库crate提供add_two函数(add_two文件夹)

    可以结合swc的源码中的目录结构和工作空间来看:https://github.com/swc-project/swc/blob/main/Cargo.toml

image.png
(目录结构)

// Cargo.toml
[workspace]

members =[
 "adder",
 "add-one",
]

// ./adder/Cargo.toml

[package]
name = "adder"
version = "0.1.0"
edition = "2018"

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

[dependencies]

add-one = { path = "../add-one" } // 因为我们需要在adder中使用库add-one的函数,所以需要在这里指明依赖关系

其中adder是我们需要运行的主文件。当我们执行cargo build时会将所有的包编译到最外层的target中。
如果想执行adder中的文件只需要执行cargo run -p adder即可。

二进制crate

  • 命令cargo install
  • 只能安装二进制目标的crate

二进制目标(binary target)是一个可运行的程序

  • 由拥有src/main.rs或者其他被指定为为进制文件的crate生成

    与二进制目标相对的还有一个库目标(libary target)由库crate生成