依赖管理与 crates.io
学习目标
掌握依赖声明方式
理解语义化版本
学会查找和选择 crate
核心概念
版本声明
[dependencies]
serde = "1.0"
serde_json = ">=1.0,<2.0"
tokio = "~1.20"
rand = "=0.8.5"
复制
语义化版本(SemVer)
主版本.次版本.补丁
↑ ↑ ↑
不兼容 新功能 Bug修复
^1.2.3 → >=1.2.3, <2.0.0
~1.2.3 → >=1.2.3, <1.3.0
Git 依赖
[dependencies]
my_lib = { git = "https://github.com/user/repo" , branch = "main" }
my_lib = { git = "https://github.com/user/repo" , tag = "v1.0" }
复制
本地依赖
[dependencies]
my_lib = { path = "../my_lib" }
复制
Feature 条件编译
[features]
default = ["json" ]
json = ["serde" , "serde_json" ]
full = ["json" , "xml" , "yaml" ]
[dependencies]
serde = { version = "1" , optional = true }
serde_json = { version = "1" , optional = true }
复制
[dependencies]
my_lib = { version = "1" , features = ["full" ] }
复制
#[cfg(feature = "json" )]
pub fn parse_json (input: &str ) -> serde_json::Value {
serde_json::from_str (input).unwrap ()
}
复制
常用命令
cargo add serde --features derive
cargo remove serde
cargo update
cargo tree
cargo tree -d
复制
实践练习
练习 1:添加 HTTP 客户端
[dependencies]
reqwest = { version = "0.12" , features = ["json" ] }
tokio = { version = "1" , features = ["full" ] }
serde = { version = "1" , features = ["derive" ] }
复制
use serde::Deserialize;
#[derive(Deserialize, Debug)]
struct User {
name: String ,
email: String ,
}
#[tokio::main]
async fn main () -> Result <(), reqwest::Error> {
let user : User = reqwest::get ("https://api.example.com/user" )
.await ?
.json ()
.await ?;
println! ("{:?}" , user);
Ok (())
}
复制
小结
语法 含义 "1.0"^1.0,兼容更新 "~1.2"补丁更新 "=1.2.3"精确版本 features启用可选功能 optional = true可选依赖