cargo学习注释(一)


前言

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可以控制编译打包以及工程组织模式的信息。

  1. workspace :可用于配置此包将属于的工作区。如果没有指定,这将被推断为文件系统中第一个 Cargo.toml 的[workspace]
  2. exclude|include : 编译阶段包含或排除的文件。
  3. build : build.rs 自定义编译阶段。
  4. 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的设定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值