前言
cargo类似于java的maven其借鉴了npm的包管理模式,可以理解为rust的包管理工具。
提示:因本身rust的特性因此cargo能够很细节的控制编译过程。文章只记录与自己认知不同的以及难理解的。
一、清单
- [package] 部分
- 依赖项 部分
- [profile.*] 部分
- [features] 部分
- [workspace] 部分
- 项目布局
- Rust 示例
- Rust 测试
- 配置一个 target
- [patch] 部分
- [replace] 部分
二、独特特性
1.package
package部分不在只标识agv用户等等非相关性还包含,还包含 build、exclude、include、workspace、metadata可以控制编译打包以及工程组织模式的信息。
- workspace :可用于配置此包将属于的工作区。如果没有指定,这将被推断为文件系统中第一个 Cargo.toml 的[workspace]
- exclude|include : 编译阶段包含或排除的文件。
- build : build.rs 自定义编译阶段。
- metadata :??? package.metadata.android 可控制打包种类
2.profile
Cargo 支持了,可通过顶层 配置文件(profile) 调用 rustc 的自定义配置,可控制编译相关的特性。
# 此为 开发配置文件, 给 `cargo build` 所使用.
[profile.dev]
opt-level = 0 # 控制编译器构建的`--opt-level`。
# 0-1适合调试。 2是良好优化的。最大为 3。
# 's' 企图优化大小, 'z' 则 进一步优化大小.
debug = true # (u32 or bool) 包括调试信息(调试符号).
# 相当于 `-C debuginfo=2` 编译器 标志.
rpath = false # 控制 编译器 是否应该设置加载器路径.
# 若为 true, 传递 `-C rpath` 标志 给 编译器.
lto = false # 链接时间优化通常会减少二进制文件和静态库的大小
# 但会增加编译时间.
# 若是 true, 传递 `-C lto` 标志 给 编译器, 和 若是一个
# 字符串值 像 'thin' ,那会传递 `-C lto=thin`
# 给 编译器
debug-assertions = true # 控制是否启用调试断言
# (e.g. debug_assert!() 和 算术溢出检查)
codegen-units = 16 # if > 1 并行代码生成,以改善
# 编译时间, 但阻止了些优化.
# 传递 `-C codegen-units`.
panic = 'unwind' # 恐慌策略 (`-C panic=...`), 也可以是 'abort'
incremental = true # 是否启用增量编译
overflow-checks = true # 使用溢出检查进行整数运算。
# 传递 `-C overflow-checks=...`标志 给 compiler.
# 发布(release)的配置文件, 用于 `cargo build --release` (和 依赖项的
# `cargo test --release`, 包括本地 library 或 binary).
[profile.release]
# 测试的配置文件, 用于 `cargo test` (对于 `cargo test --release`,可看
# `release` 和 `bench` 配置文件).
[profile.test]
# 基准的配置文件, 用于`cargo bench` (和 要测试的目标 和
# 单元测试的 `cargo test --release`).
3.features
- 条件编译选项(通过cfg属性);
- 可选的依赖项,增强了包,但不是必需的;还有
- 可选依赖项的簇,如postgres,其中就包括postgres包postgres-macros包,以及可能的其他包(如开发时的模拟库、调试工具等)。
[features]
# 默认的可选包集。大多数人都想使用这些
# 包, 但它们是严格可选的。请注意,`session`不是包
# 而是此清单中列出的另一个功能。
default = ["jquery", "uglifier", "session"]
# 没有依赖关系的特性,主要用于条件编译,
# 像 `#[cfg(feature = "go-faster")]`.
go-faster = []
# `secure-password` 特性 需要 bcrypt 包. 这种别名
将允许人们以更高级别的方式讨论该 特性 和 允许
# 此软件包将在未来为该特性添加更多要求.
secure-password = ["bcrypt"]
# 特性可用于重新导出其他包的特性. `awesome`包的 `session`
# 特性将确保 cookie/session 也是可用的
session = ["cookie/session"]
个人理解:
1、features.default可用于挑选可选依赖,可能是再rust语言体系中有的包可以是仅用于服务编译阶段的包,类似java 的annotationprocessor 如lombok,若其仅用于增强编译而不需要再次提供@Data之类注解的情况,在java中类似于scope = opotianl。
2、features.自定义 go-faster=[] 定义自身特性[]需要用到的第三方包,此特性可用于引入可选编译包,其也可以引入其他包的特性。
3、dependency.awsome 拓展依赖内部特性的导出而不是统一管理在features中。
4、特性名称不能与包名冲突。
4.workspace| tests | examples
- 工作空间类似于module管理比maven更方便也没有maven结合ide的相关bug集成度非常高。
从以下设计中可知,rust开发者非常认可前后端分离。
[workspace.metadata.webcontents] root = "path/to/webproject" tool = ["npm", "run", "build"]
>
>
> - tests成熟的设定。
> - examples非常nice的设定。