Rust cargo入门:包管理和练习

157 阅读2分钟

概述

Rust具有先进的包管理工具,并且和Go类似支持git地址。Rust mod的思维和别的语言有些不同,不同于Java的繁琐,Go的目录为mod,JS的文件为mod,Rust结合了目录为mod和文件为mod,并且支持在源码中手动导出mod,mod深度最多为1层,多层使用use mod1::mod2而非mod mod1::mod2的思路不失为一种好的选择。

pratice

rust basic

hello

  • cargo new/init 创建新项目
  • cargo的产物在target/debug|release/$bin
  • 如果需要build多个bin,需要配置[[bin]],或者放在sre/bin目录下自动发现
  • cargo update: 重新梳理依赖关系,-p指定特定包
cargo new helloworld
cd helloworld

cargo build
./target/debug/helloworld
cargo run
cargo build --release
cargo run --bin main
[[bin]]
name ="main"
path ="src/main.rs"

[[bin]]
name ="main2"
path ="src/main2.rs"

target convention

  • [lib]
  • [[bin]]
  • [[example]]
  • [[test]]
  • [[bench]]

cargo的内部模块管理

  1. 文件mod
  • 以文件名为mod名,和main.rs在同一路径下,以rpc.rs为例
  • main使用mod rpc表示import mod
  • main使用use rpc::{grpc, http}表示import pub,和C++的using含义类似
  1. 文件夹mod
  • 以文件夹名为mod名,在main.rs的子目录,以src/mod1为例
  • src/mod1下建立mod.rs,表明这个文件夹是一个mod
  • main使用方式和文件mod一样
  1. 多重mod
  • 如果希望mod1里再嵌套一个mod2,思路是把mod1当做main,mod2就是下一级
  • 在mod1中,需要在mod.rs显式声明pub mod mod2表明mod1中会导出mod2
  • 因此,rust mod的本质是只能存在1层,但每一层的mod可以管理自己下一层,这样对于main就是多重mod了
  1. 绝对导入和相对导入
  • create:绝对导入前缀,指向当前目的root模块
  • self:指向于当前模块的元素,用于任何想要引入自身模块所包含的内容时。(例如父模块重新导出子模块 pub use self:​:cake:​:​Cake;)
  • super:指向父模块,用于从父模块导入元素。(如果模块bar希望访问副模块foo中的元素Foo,那么可以用super::foo::Foo)

cargo的外部模块

  • 创建:cargo new --lib hellolib
  • 使用:use hellolib::mod_name::pub_name
  • 在2018以前,需要extern crate

rustup

rustup toolchain

  • rust版本由版本号+架构决定,由于一般不用交叉编译,直接安装版本就是安装当前的架构版本
rustup toolchain list

rustup install 1.74.0

rustup default 1.74.0-x86_64-apple-darwin

rustlings

  • 直接源码安装最快,可能要升级一下rust版本
git clone -b 5.6.1 --depth 1 https://github.com/rust-lang/rustlings
cd rustlings
cargo install --force --path .
rustlings watch

ref

cargo