Cargo是Rust語言的包管理器和構建工具。它能夠幫助我們管理依賴、構建項目、運行測試和發布程序等。在Rust社區中,Cargo已經成為了標準的構建工具,它為Rust的開發者提供了極大的便利。
安裝和使用 cargo
在安裝Rust時,Cargo也已經隨之安裝。 如果你還沒有安裝Rust,可以參考系列教程的第一篇 Rust語言從入門到精通系列 - Hello World!
, 也可以前往官網 下載安裝包進行安裝。 安裝完成后,可以通過以下命令來檢查Cargo是否安裝成功:
cargo --version
# cargo 1.68.0 (115f34552 2023-02-26)
輸出了Cargo的版本號,說明安裝成功。環境檢查完成,下面開始Cargo的學習。
我們先回顧一下上一篇文章中使用過的Cargo命令。 第一個使用Cargo命令是"cargo new", 創建了我們的第一個Rust項目。沒看過第一篇的同學可以嘗試如下命令創建:
cargo new hello_world
這條命令會在當前目錄下創建一個名為hello_world的新項目。其中,hello_world是項目的名稱,可以根據自己的需要進行修改。 創建完成后,打開項目的目錄hello_world。
目錄結構如下圖所示:
/
├── Cargo.lock
├── Cargo.toml
├── crate-information.json
├── src/
│ ├── main.rs
└── target/
└── tools/
Cargo生成的最基本的項目結構,包括src目錄(用于存放開發的源代碼)和Cargo.toml文件(管理項目元數據、編譯構建、第三方庫依賴等等)。
在src目錄下,我們看到一個名為main.rs的文件,它是Rust程序的入口文件,內部實現一個默認的main()方法:
fn main() {
println!("Hello, world!");
}
在main()方法體中輸入 println!("Hello, world!");
這就是一個非常簡單的程序,它的功能是再命令提示符窗口打印輸出一句話“Hello, world!”。在VS Code中按 F5 運行你的第一個程序吧。
假如你沒有配置VS Code啟動配置,那么再運行程序之前,Cargo會先使用build命令來構建項目,生成可執行文件。 至此,我們又新接觸了一個cargo命令 build:
cargo build
cargo build 命令會在項目的根目錄下生成一個target目錄,其中包含了構建后的二進制文件。在默認情況下,Cargo會生成一個名為hello_world的二進制文件。
如果只想編譯項目而不生成二進制文件,可以使用以下命令:
cargo check
這條命令會檢查代碼是否可以編譯通過,但不會生成二進制文件。
在構建完成后,我們可以使用以下命令來運行程序:
cargo run
這條命令會自動編譯并運行項目。如果一切正常,你應該能夠看到和Vs Code按F5啟動一樣的“Hello, world!”的輸出。
常用指令
上一小節,我們使用了Cargo的new,build, run, check四個指令,除了這幾個指令外,Cargo 還提供了更多的指令,下面列舉并注釋其中最常用的一些指令:
- ? new: 指令可以創建一個新的 Rust 項目。它有兩個參數,第一個參數是項目名稱,第二個參數是項目類型,可以是 bin 或 lib。默認情況下,new 會創建一個二進制bin項目。
- ? init: 指令可以將當前目錄初始化為一個 Rust 項目。它會創建一個默認的 src 目錄和 Cargo.toml 文件。
- ? check: 指令可以檢查代碼是否可以編譯通過,但 不會生成二進制文件 。
- ? build: 指令可以編譯 Rust 項目,并生成二進制文件。如果項目已經編譯過,build 指令會跳過編譯過程。
- ? run: 指令可以編譯并運行 Rust 項目。如果項目已經編譯過,run 指令會跳過編譯過程。
- ? test: 指令可以運行項目中的測試。測試代碼通常放在 src/test.rs 或 src/lib.rs 中。
- ? bench: 指令可以運行項目中的基準測試。基準測試用來測試代碼的性能。
- ? doc: 指令可以生成項目的文檔。文檔通常使用 Rust 內置的文檔工具 rustdoc 來生成。
- ? clean: 指令可以清除項目的構建文件和生成的二進制文件。
- ? update: 指令可以更新項目中的依賴。
- ? publish: 指令可以將項目發布到 crates.io 上,供其他人使用。
更多指令可以通過 cargo --help 或 cargo --help 查看。
自定義擴展指令
依賴管理
在Rust項目中,我們可以使用Cargo來管理依賴。可以通過編輯Cargo.toml文件來添加依賴。 例如,我們想要使用rand庫來生成隨機數,可以在Cargo.toml文件中添加以下內容:
[dependencies]
rand = "0.8.4"
這條語句告訴Cargo,我們需要使用rand庫,并且希望使用版本號為0.8.4的版本。在保存文件后,可以使用以下命令來安裝依賴:
cargo build
這條命令會自動下載并安裝依賴。 在代碼中使用依賴時,我們需要在main.rs文件中添加以下語句:
use rand::Rng;
fn main() {
let mut rng = rand::thread_rng();
let n: u8 = rng.gen();
println!("Random number: {}", n);
}
這里,我們使用了rand庫中的Rng trait和thread_rng函數來生成隨機數。
版本號控制
上面的示例我們引入了指定0.8.4版本的rand庫依賴,并在命令提示符中打印了隨機數。這里我們進一步對依賴管理進行學習。
除了指定依賴的特定版本外,我們還可以使用邏輯運算符控制版本范圍, 具體如下:
- ? =: 等于某個版本。等同于直接填寫版本號
- ? >: 大于某個版本。
- ? <=: 小于等于某個版本。
- ? : 大約等于某個版本,例如1.2.3表示大約等于1.2.3,但是允許最后一位數字不同,例如1.2.4。
- ? ^: 兼容某個版本,例如^1.2.3表示兼容1.2.x系列的所有版本,但是不兼容2.0.0及以上版本。
假如我們想指定依賴庫的版本號大于等于0.7.3版本 且 小于0.8.4,示例:
[dependencies]
rand = " >=0.7.3, < 0.8.4"
指定依賴項的特性
有些庫提供了多個特性,可以用來啟用或禁用某些功能。例如,serde庫提供了一個名為derive的特性,用于啟用派生宏。為了指定依賴項的特性,可以使用如下語法:
[dependencies]
庫名稱 = { version = "版本號", features = ["特性名稱"] }
log是一個用于日志記錄的庫。它提供了多個特性,可以用來啟用或禁用某些功能。下面是一些常見的特性及其用途:
- ? std: 用于啟用log的標準庫支持,可以在標準庫環境中使用log。
- ? env_logger: 用于啟用log的環境變量支持,可以使用環境變量來控制日志輸出。
- ? log4rs: 用于啟用log的log4rs支持,可以使用log4rs庫來配置日志輸出。
- ? simplelog: 用于啟用log的simplelog支持,可以使用simplelog庫來配置日志輸出。
下面是一個示例:
[dependencies]
log = { version = "0.4", features = ["std"] }
除了啟用特性之外,還可以禁用特性,例如:
[dependencies]
log = { version = "0.4", default-features = false }
指定依賴項的路徑
在某些情況下,我們可能需要使用本地文件系統中的庫。為了指定依賴項的路徑,可以使用如下語法:
[dependencies]
rand = { path = "../rand" }
在這個例子中,我們指定了一個名為rand的庫,路徑為../rand。這告訴Cargo編譯器,我們的項目需要使用本地文件系統中的rand庫。當我們運行cargo build命令時,Cargo會自動編譯指定路徑下的rand庫,并將它添加到我們的項目中。
除了使用本地文件系統中的庫之外,我們還可以使用git倉庫中的庫。為了指定依賴項的git倉庫,可以使用如下語法:
[dependencies]
rand = { git = "https://github.com/rust-lang-nursery/rand.git" }
項目元數據
本文的前面章節介紹了Cargo的常用質量,依賴管理特性。本小節主要講解Cargo.toml文件中定義的程序元數據,例如:程序的名稱、版本號、作者和描述等信息:
[package]
## 項目名(程序名稱)
name = "hello_world"
## 版本號
version = "0.1.0"
## 作者, 多個按逗號分隔
authors = ["Your Name < your_email@example.com >"]
## 項目描述
description = "A hello world program in Rust."
## Rust語言的版本,目前支持2015、2018和2021 三個版本。
edition = "2021"
除了基礎的元數據外,我們還可以在[package.metadata]下自定義專屬的元數據:
[package.metadata]
url = "https://github.com/username/hello-world"
doc = "https://docs.rs/hello-world"
repository = "https://github.com/username/hello-world.git"
總結
通過本文的介紹,我們了解了Rust語言的包管理器和構建工具Cargo。學習了如何創建一個新的Rust項目、編寫Rust程序、構建和運行程序、添加依賴等操作。
-
安裝
+關注
關注
2文章
97瀏覽量
22187 -
程序
+關注
關注
115文章
3719瀏覽量
80355 -
管理器
+關注
關注
0文章
239瀏覽量
18434 -
rust語言
+關注
關注
0文章
57瀏覽量
2988
發布評論請先 登錄
相關推薦
評論