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.
|
|
|
|
# 发布配置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
|