You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
3.5 KiB

# 发布配置Profile
细心的同学可能发现了迄今为止我们已经为 Cargo 引入了不少新的名词,而且这些名词有一个共同的特点,不容易或不适合翻译成中文,因为难以表达的很准确,例如 Cargo Target, Feature 等,这不现在又多了一个 Profile。
## 默认的 profile
Profile 其实是一种发布配置,例如它默认包含四种: `dev``release``test``bench`,正常情况下,我们无需去指定,`Cargo` 会根据我们使用的命令来自动进行选择
- 例如 `cargo build` 自动选择 `dev` profile`cargo test` 则是 `test` profile, 出于历史原因,这两个 profile 输出的结果都存放在项目根目录下的 `target/debug` 目录中,结果往往用于开发/测试环境
-`cargo build --release` 自动选择 `release` profile并将输出结果存放在 `target/release` 目录中,结果往往用于生产环境
可以看出 Profile 跟 Nodejs 的 `dev``prod` 很像,都是通过不同的配置来为目标环境构建最终编译后的结果: `dev` 编译输出的结果用于开发环境,`prod` 则用于生产环境。
针对不同的 profile编译器还会提供不同的优化级别例如 `dev` 用于开发环境,因此构建速度是最重要的:此时,我们可以牺牲运行性能来换取编译性能,那么优化级别就会使用最低的。而 `release` 则相反,优化级别会使用最高,导致的结果就是运行得非常快,但是编译速度大幅降低。
> 初学者一个常见的错误,就是使用非 `release` profile 去测试性能,例如 `cargo run`,这种方式显然无法得到正确的结果,我们应该使用 `cargo run --release` 的方式测试性能
profile 可以通过 `Cargo.toml` 中的 `[profile]` 部分进行设置和改变:
```toml
[profile.dev]
opt-level = 1 # 使用稍高一些的优化级别最低是0最高是3
overflow-checks = false # 关闭整数溢出检查
```
需要注意的是,每一种 profile 都可以单独的进行设置,例如上面的 `[profile.dev]`
如果是工作空间的话,只有根 package 的 `Cargo.toml` 中的 `[profile` 设置才会被使用,其它成员或依赖包中的设置会被自动忽略。
另外profile 还能在 Cargo 自身的配置文件中进行覆盖,总之,通过 `.cargo/config.toml` 或环境变量的方式所指定的 `profile` 配置会覆盖项目的 `Cargo.toml` 中相应的配置。
## 自定义profile
除了默认的四种 profile我们还可以定义自己的。对于大公司来说这个可能会非常有用自定义的 profile 可以帮助我们建立更灵活的工作发布流和构建模型。
当定义 profile 时,你必须指定 `inherits` 用于说明当配置缺失时,该 profile 要从哪个 profile 那里继承配置。
例如,我们想在 release profile 的基础上增加 [LTO](#lto) 优化,那么可以在 `Cargo.toml` 中添加如下内容:
```toml
[profile.release-lto]
inherits = "release"
lto = true
```
然后在构建时使用 `--profile` 来指定想要选择的自定义 profile
```shell
cargo build --profile release-lto
```
与默认的 profile 相同,自定义 profile 的编译结果也存放在 [`target/`](https://course.rs/cargo/guide/build-cache.html) 下的同名目录中,例如 `--profile release-lto` 的输出结果存储在 `target/release-lto` 中。
## profile设置
下面我们来看看 profile 中可以进行哪些优化设置。
#### opt-level
#### lto