網(wǎng)站建設(shè)費(fèi)用推薦網(wǎng)絡(luò)專(zhuān)業(yè)網(wǎng)絡(luò)服務(wù)商電話(huà)
以下內(nèi)容為本人的學(xué)習(xí)筆記,如需要轉(zhuǎn)載,請(qǐng)聲明原文鏈接 微信公眾號(hào)「ENG八戒」https://mp.weixin.qq.com/s/ceMTUzRjDoiLwjn_KfZSrg
這幾年 Rust 可謂是炙手可熱的新興編程語(yǔ)言了,而且被投票為最受程序員喜愛(ài)的語(yǔ)言。它很現(xiàn)代,專(zhuān)門(mén)為了性能、可靠和生產(chǎn)力而設(shè)計(jì),說(shuō)人話(huà)就是非???#xff0c;不容易崩潰,開(kāi)發(fā)效率高。
那么,如此熱門(mén)的計(jì)算機(jī)語(yǔ)言,它如何去構(gòu)建軟件和管理構(gòu)建工程呢?
Rust 語(yǔ)言的開(kāi)發(fā)團(tuán)隊(duì)提供了標(biāo)準(zhǔn)方案,利用 rust 自帶的一個(gè)包 Cargo 幫助開(kāi)發(fā)人員靈活高效地構(gòu)建代碼。Cargo 提供下載各式各樣的庫(kù)或者工程依賴(lài)項(xiàng),發(fā)布自己的包和上傳到 crates.io 共享給所有開(kāi)發(fā)者等。
下面讓我們一起來(lái)看看什么是 cargo,它可以如何幫助我們開(kāi)發(fā)者構(gòu)建自己的 rust 工程。關(guān)于怎么安裝 rust 和 cargo 相關(guān)可以查看八戒的另一篇文章《簡(jiǎn)明快速配置 Rust 工具鏈》。
本文以下演示都是基于 ubuntu 18.04.6。
手動(dòng)構(gòu)建和運(yùn)行
先來(lái)看看直接使用 rust 的編譯器 rustc 編譯 hello world 示例。準(zhǔn)備一個(gè) rust 源碼文件,輸入以下內(nèi)容
fn main() {println!("Hello rust world!");
}
rust 源碼文件的后綴為 (.rs),所以上面的文件保存為 hello.rs。
調(diào)用 rustc 編譯文件 hello.rs
$ rustc hello.rs
編譯沒(méi)有錯(cuò)誤返回意味著成功結(jié)束,這時(shí)生成了可執(zhí)行文件 hello,與輸入源文件同名
$ ll
total 4544
drwxrwxrwx 1 user user 512 Nov 14 00:55 ./
drwxrwxrwx 1 user user 512 Nov 14 00:54 ../
-rwxrwxrwx 1 user user 4652168 Nov 14 00:55 hello
-rwxrwxrwx 1 user user 50 Nov 14 00:54 hello.rs
再手動(dòng)執(zhí)行文件 hello 看看輸出
$ ./hello
Hello rust world!
這樣的構(gòu)建過(guò)程,一切挺順利的,尤其是我們突然靈光一閃,腦袋有個(gè)想法需要快速驗(yàn)證時(shí),這樣也不錯(cuò)。但是這只是編譯了一個(gè)源碼文件,要是我們的開(kāi)發(fā)工程異常龐大,源碼文件去到上百上千個(gè)文件時(shí),再使用編譯器 rustc 手動(dòng)編譯真的太費(fèi)勁啦。就好像現(xiàn)在的大型 C/C++ 工程基本都用 cmake 管理一樣,咱的 rust 工程有 cargo。
創(chuàng)建一個(gè) package
Cargo 是 rust 團(tuán)隊(duì)的指定構(gòu)建系統(tǒng)和包管理器,可以利用它快速創(chuàng)建一個(gè)空的 package 工程,執(zhí)行構(gòu)建的時(shí)候 cargo 會(huì)根據(jù)配置文件內(nèi)容自動(dòng)下載依賴(lài)項(xiàng)等。相信大伙在碰到 rust 的另一個(gè)概念 crate 是會(huì)感到很困惑,其實(shí)一般情況下 package 都可以被當(dāng)做是 crate,就是說(shuō)可以互換。
下面來(lái)看看怎么創(chuàng)建新 package 工程
$ cargo new hello_rustCreated binary (application) `hello_rust` package
上面示例使用了 cargo new 指令創(chuàng)建一個(gè)名字是 hello_rust 的新 package 工程,然后用 tree 指令看看都自動(dòng)創(chuàng)建了哪些文件和路徑
$ cd hello_rust/
$ tree .
.
├── Cargo.toml
└── src└── main.rs1 directory, 2 files
可以看到有個(gè) Cargo.toml 文件,它是 cargo 構(gòu)建 package 工程的配置文件,不過(guò)看起來(lái)有點(diǎn)陌生,先繼續(xù)看其它內(nèi)容。
在 src 文件夾下有個(gè) rust 源碼文件 main.rs,打開(kāi)看看里邊的內(nèi)容
$ cat src/main.rs
fn main() {println!("Hello, world!");
}
原來(lái) main.rs 包含了一個(gè) hello world 的示例代碼,真的是一步到位。
回過(guò)頭來(lái)再看 Cargo.toml
$ cat Cargo.toml
[package]
name = "hello_rust"
authors = ["ENG八戒"]
version = "0.1.0"
edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]
可以看到文件 Cargo.toml 內(nèi)包含了多個(gè) section,比如 package、dependencies。
在 package 字段,包含了工程的名字 name,作者 authors,工程版本 version,rust 版本等。格式是鍵值對(duì)的形式,= 后邊的值用 [] 界定表示該值類(lèi)型是列表的形式,內(nèi)容可以是多個(gè),比如軟件工程的作者就可以有多個(gè)。
而 dependencies 字段用于填寫(xiě)該工程的依賴(lài)項(xiàng),依賴(lài)項(xiàng)就是我們?cè)陂_(kāi)發(fā)軟件時(shí),有很多的內(nèi)容可以直接借用別人的成果,或者避免浪費(fèi)自己的時(shí)間重復(fù)造輪子。而別人的成果通常以包的形式提供,我們只需要在這個(gè)配置文件的 dependencies 字段里填寫(xiě)對(duì)應(yīng)的包信息。
假設(shè)依賴(lài)項(xiàng)中包含產(chǎn)生隨機(jī)數(shù)的 rand 包,可以如下填寫(xiě)
...
[dependencies]
rand = "0.8.5"
上面填寫(xiě)的依賴(lài)項(xiàng)內(nèi)容不僅有包名,還有具體的版本。但是,我們?cè)趺粗垃F(xiàn)時(shí)有哪些具體的包和版本呢?
可以用 cargo search 指令,后邊加上對(duì)應(yīng)的模糊包名,這樣 cargo 就會(huì)從 crates.io 查找可用包并打印,你再?gòu)闹羞x一個(gè)合適的
$ cargo search rand
rand = "0.8.5" # Random number generators and other randomness functionality.
bevy_rand = "0.4.0" # A plugin to integrate rand for ECS optimised RNG for the Bevy game engine.
tinyrand = "0.5.0" # Lightweight RNG specification and several ultrafast implementations in Rust.
random_derive = "0.0.0" # Procedurally defined macro for automatically deriving rand::Rand for structs and enums
tera-rand = "0.2.0" # A suite of random data generation functions for the Tera template engine
tera-rand-cli = "0.2.0" # A CLI tool for generating a feed of random data from a Tera template
faker_rand = "0.1.1" # Fake data generators for lorem ipsum, names, emails, and more
rand_derive2 = "0.1.21" # Generate customizable random types with the rand crate
fake-rand-test = "0.0.0" # Random number generators and other randomness functionality.
ndarray-rand = "0.14.0" # Constructors for randomized arrays. `rand` integration for `ndarray`.
... and 1219 crates more (use --limit N to see more)
未完待續(xù)…