Cargo是Rust語言的包管理器和構(gòu)建工具。它能夠幫助我們管理依賴、構(gòu)建項目、運(yùn)行測試和發(fā)布程序等。在Rust社區(qū)中,Cargo已經(jīng)成為了標(biāo)準(zhǔn)的構(gòu)建工具,它為Rust的開發(fā)者提供了極大的便利。
安裝和使用 cargo
在安裝Rust時,Cargo也已經(jīng)隨之安裝。 如果你還沒有安裝Rust,可以參考系列教程的第一篇 Rust語言從入門到精通系列 - Hello World!
, 也可以前往官網(wǎng) 下載安裝包進(jìn)行安裝。 安裝完成后,可以通過以下命令來檢查Cargo是否安裝成功:
cargo --version
# cargo 1.68.0 (115f34552 2023-02-26)
輸出了Cargo的版本號,說明安裝成功。環(huán)境檢查完成,下面開始Cargo的學(xué)習(xí)。
我們先回顧一下上一篇文章中使用過的Cargo命令。 第一個使用Cargo命令是"cargo new", 創(chuàng)建了我們的第一個Rust項目。沒看過第一篇的同學(xué)可以嘗試如下命令創(chuàng)建:
cargo new hello_world
這條命令會在當(dāng)前目錄下創(chuàng)建一個名為hello_world的新項目。其中,hello_world是項目的名稱,可以根據(jù)自己的需要進(jìn)行修改。 創(chuàng)建完成后,打開項目的目錄hello_world。
目錄結(jié)構(gòu)如下圖所示:
/
├── Cargo.lock
├── Cargo.toml
├── crate-information.json
├── src/
│ ├── main.rs
└── target/
└── tools/
Cargo生成的最基本的項目結(jié)構(gòu),包括src目錄(用于存放開發(fā)的源代碼)和Cargo.toml文件(管理項目元數(shù)據(jù)、編譯構(gòu)建、第三方庫依賴等等)。
在src目錄下,我們看到一個名為main.rs的文件,它是Rust程序的入口文件,內(nèi)部實(shí)現(xiàn)一個默認(rèn)的main()方法:
fn main() {
println!("Hello, world!");
}
在main()方法體中輸入 println!("Hello, world!");
這就是一個非常簡單的程序,它的功能是再命令提示符窗口打印輸出一句話“Hello, world!”。在VS Code中按 F5 運(yùn)行你的第一個程序吧。
假如你沒有配置VS Code啟動配置,那么再運(yùn)行程序之前,Cargo會先使用build命令來構(gòu)建項目,生成可執(zhí)行文件。 至此,我們又新接觸了一個cargo命令 build:
cargo build
cargo build 命令會在項目的根目錄下生成一個target目錄,其中包含了構(gòu)建后的二進(jìn)制文件。在默認(rèn)情況下,Cargo會生成一個名為hello_world的二進(jìn)制文件。
如果只想編譯項目而不生成二進(jìn)制文件,可以使用以下命令:
cargo check
這條命令會檢查代碼是否可以編譯通過,但不會生成二進(jìn)制文件。
在構(gòu)建完成后,我們可以使用以下命令來運(yùn)行程序:
cargo run
這條命令會自動編譯并運(yùn)行項目。如果一切正常,你應(yīng)該能夠看到和Vs Code按F5啟動一樣的“Hello, world!”的輸出。
常用指令
上一小節(jié),我們使用了Cargo的new,build, run, check四個指令,除了這幾個指令外,Cargo 還提供了更多的指令,下面列舉并注釋其中最常用的一些指令:
- ? new: 指令可以創(chuàng)建一個新的 Rust 項目。它有兩個參數(shù),第一個參數(shù)是項目名稱,第二個參數(shù)是項目類型,可以是 bin 或 lib。默認(rèn)情況下,new 會創(chuàng)建一個二進(jìn)制bin項目。
- ? init: 指令可以將當(dāng)前目錄初始化為一個 Rust 項目。它會創(chuàng)建一個默認(rèn)的 src 目錄和 Cargo.toml 文件。
- ? check: 指令可以檢查代碼是否可以編譯通過,但 不會生成二進(jìn)制文件 。
- ? build: 指令可以編譯 Rust 項目,并生成二進(jìn)制文件。如果項目已經(jīng)編譯過,build 指令會跳過編譯過程。
- ? run: 指令可以編譯并運(yùn)行 Rust 項目。如果項目已經(jīng)編譯過,run 指令會跳過編譯過程。
- ? test: 指令可以運(yùn)行項目中的測試。測試代碼通常放在 src/test.rs 或 src/lib.rs 中。
- ? bench: 指令可以運(yùn)行項目中的基準(zhǔn)測試。基準(zhǔn)測試用來測試代碼的性能。
- ? doc: 指令可以生成項目的文檔。文檔通常使用 Rust 內(nèi)置的文檔工具 rustdoc 來生成。
- ? clean: 指令可以清除項目的構(gòu)建文件和生成的二進(jìn)制文件。
- ? update: 指令可以更新項目中的依賴。
- ? publish: 指令可以將項目發(fā)布到 crates.io 上,供其他人使用。
更多指令可以通過 cargo --help 或 cargo --help 查看。
自定義擴(kuò)展指令
依賴管理
在Rust項目中,我們可以使用Cargo來管理依賴??梢酝ㄟ^編輯Cargo.toml文件來添加依賴。 例如,我們想要使用rand庫來生成隨機(jī)數(shù),可以在Cargo.toml文件中添加以下內(nèi)容:
[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函數(shù)來生成隨機(jī)數(shù)。
版本號控制
上面的示例我們引入了指定0.8.4版本的rand庫依賴,并在命令提示符中打印了隨機(jī)數(shù)。這里我們進(jìn)一步對依賴管理進(jìn)行學(xué)習(xí)。
除了指定依賴的特定版本外,我們還可以使用邏輯運(yùn)算符控制版本范圍, 具體如下:
- ? =: 等于某個版本。等同于直接填寫版本號
- ? >: 大于某個版本。
- ? <=: 小于等于某個版本。
- ? : 大約等于某個版本,例如1.2.3表示大約等于1.2.3,但是允許最后一位數(shù)字不同,例如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的標(biāo)準(zhǔn)庫支持,可以在標(biāo)準(zhǔn)庫環(huán)境中使用log。
- ? env_logger: 用于啟用log的環(huán)境變量支持,可以使用環(huán)境變量來控制日志輸出。
- ? log4rs: 用于啟用log的log4rs支持,可以使用log4rs庫來配置日志輸出。
- ? simplelog: 用于啟用log的simplelog支持,可以使用simplelog庫來配置日志輸出。
下面是一個示例:
[dependencies]
log = { version = "0.4", features = ["std"] }
除了啟用特性之外,還可以禁用特性,例如:
[dependencies]
log = { version = "0.4", default-features = false }
指定依賴項的路徑
在某些情況下,我們可能需要使用本地文件系統(tǒng)中的庫。為了指定依賴項的路徑,可以使用如下語法:
[dependencies]
rand = { path = "../rand" }
在這個例子中,我們指定了一個名為rand的庫,路徑為../rand。這告訴Cargo編譯器,我們的項目需要使用本地文件系統(tǒng)中的rand庫。當(dāng)我們運(yùn)行cargo build命令時,Cargo會自動編譯指定路徑下的rand庫,并將它添加到我們的項目中。
除了使用本地文件系統(tǒng)中的庫之外,我們還可以使用git倉庫中的庫。為了指定依賴項的git倉庫,可以使用如下語法:
[dependencies]
rand = { git = "https://github.com/rust-lang-nursery/rand.git" }
項目元數(shù)據(jù)
本文的前面章節(jié)介紹了Cargo的常用質(zhì)量,依賴管理特性。本小節(jié)主要講解Cargo.toml文件中定義的程序元數(shù)據(jù),例如:程序的名稱、版本號、作者和描述等信息:
[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"
除了基礎(chǔ)的元數(shù)據(jù)外,我們還可以在[package.metadata]下自定義專屬的元數(shù)據(jù):
[package.metadata]
url = "https://github.com/username/hello-world"
doc = "https://docs.rs/hello-world"
repository = "https://github.com/username/hello-world.git"
總結(jié)
通過本文的介紹,我們了解了Rust語言的包管理器和構(gòu)建工具Cargo。學(xué)習(xí)了如何創(chuàng)建一個新的Rust項目、編寫Rust程序、構(gòu)建和運(yùn)行程序、添加依賴等操作。
-
安裝
+關(guān)注
關(guān)注
2文章
98瀏覽量
22368 -
程序
+關(guān)注
關(guān)注
117文章
3798瀏覽量
81456 -
管理器
+關(guān)注
關(guān)注
0文章
248瀏覽量
18626 -
rust語言
+關(guān)注
關(guān)注
0文章
57瀏覽量
3031
發(fā)布評論請先 登錄
相關(guān)推薦
如何在Rust中連接和使用MySQL數(shù)據(jù)庫
【MYD-Y6ULX試用體驗(yàn)】建立開發(fā)環(huán)境
只會用Python?教你在樹莓派上開始使用Rust
基于matlab約束優(yōu)化懲罰函數(shù)法
如何在STM32 (Cortex M3)和GD32(RISC-V)上用Rust開發(fā)
【沁恒微CH32V307評估板試用體驗(yàn)】探索Rust編程語言的嵌入式開發(fā)——基于CH32V307【1】
如何在構(gòu)建yocto時將rust和cargo包安裝為圖像?
基于E-CARGO的多任務(wù)分配管理
![基于E-<b class='flag-5'>CARGO</b>的多任務(wù)分配管理](https://file.elecfans.com/web2/M00/49/65/poYBAGKhwKyAUSEFAAAV-Yl1sLI127.jpg)
坐出租車也可購買商品?優(yōu)步與Cargo正式合作后的計劃
cargo careful:為你的代碼提供更多安全保證
![<b class='flag-5'>cargo</b> careful:為你的代碼提供更多安全保證](https://file.elecfans.com/web2/M00/74/62/pYYBAGNZ5MCAYh6nAAD3HjtnuF0048.jpg)
評論