rust门卡有什么用_Rust能力养成之(10)用Cargo进行项目管理:扩展 调用与优化
前言
上一篇我們講了Cargo運行測試
Cargo運行實例
Cargo工作空間
當然,Cargo也能夠進行擴展,合并外部工具以增強開發體驗,在設計上,其可擴展性已經達到非常豐富和恰當的程度。Cargo可以通過簡單的二進制名稱(binary-name)語法調用開發人員所創建的命令行工具。
在這一節中,我們就來看看其中的一些經常用得上的工具來幫助我們提升代碼的編寫效率和可讀性。
那么本篇內容涉及子命令定制與安裝
用 Clippy來 Linting 代碼
子命令定制與安裝
為Cargo定制化命令行工具在結構上歸為Cargo的子命令(subcommands)范疇。這些工具通常是二進制文件,主要來自于GitHub,或者本地項目目錄,都可以通過cargo install 或者進行安裝。
下面我們看一個實例cargo-watch tool。
cargo-watch
這里的watch肯定不是手表,顯然是崗哨觀察的意思。
每當對代碼進行更改時,通過在后臺自動生成項目,cargo-watch可以有助于縮短修復、編譯和運行周期。
默認情況下,該工具只運行Rust的類型檢查器(cargo check命令),而不進行代碼生成階段(這需要時間),便縮短了編譯時間;還可以使用-x flag 提供一個定制命令來代替cargo check。
我們可以通過運行cargo install cargo-watch來安裝cargo-watch,
然后在任何cargo項目中,都可以通過調用cargo watch來運行它。
現在,無論何時我們對項目進行更改,cargo-watch都會在后臺運行cargo check并為我們重新編譯項目。
在下面的代碼中,做了一個拼寫錯誤:(如圖所示,將之寫過pow函數的返回值類型做成i6)
cargo watch提示有問題:
在我們進行了糾正之后,Cargo watch重新編譯了這個項目:
這一點非常類似于Node.js生態系統中的watchman或nodemon包。
cargo-edit
Cargo -edit子命令可以用于自動添加Cargo.toml文件的依賴項,原則上可以添加所有類型的依賴項,包括dev依賴項和build依賴項,還可以添加任何依賴項的特定版本。
該工具可以通過運行cargo install cargo-edit來安裝,主要提供四個命令:cargo add
cargo rm
cargo edit
cargo upgrade
cargo-deb
這是另一個有用的社區開發的子命令,可以用來創建Debian包(.deb),以便在Debian Linux,比如Ubuntu上輕松發布Rust可執行文件;
可以通過運行cargo install cargo-deb來安裝。我們將在本章末尾使用這個工具之前構建的imgtool命令行可執行文件打包成.deb包。
cargo-outdated
此命令行工具可以顯示Cargo項目中過期的crate依賴項;可以通過運行cargo install cargo-outdated來安裝。安裝完畢后,可以通過在項目目錄中運行cargo outdated來查看有哪些crate已經“老”了。
現在,這些子命令與Cargo無縫協作的方式表現為:開發人員使用命名約定創建這些二進制crate,比如Cargo -[cmd],當使用 cargo install 安裝該二進制crate時,Cargo將已安裝的二進制文件傳遞給$PATH變量,然后可以使用cargo 進行調用。
應該說,這是一種簡單而有效的方式,Cargo通過社區開發的子命令來擴展自身。當然還有許多其他類似的擴展,可以在下面網址上找到所有社區管理的子命令工具列表。https://github.com/rust-lang/cargo/wiki/Third-party-cargo-subcommands?github.com
cargo install也用于安裝任何二進制crate或在Rust中開發的可執行文件/應用程序,這些文件和程序默認安裝在/home//.cargo/bin/目錄。
我們將以此來安裝和構建的imgtool應用程序,使其在系統范圍內可用。
用 Clippy來 Linting 代碼
在編程實踐中,將有助于將代碼寫的容易維護,質量合乎一定規范的做法,稱為Linting,在Rust中,相應的工具是clippy。
在本節中,我們將安裝clippy并在之前建立的庫中試用一下:添加一些虛擬代碼,并看看clippy能給出什么建議。
在項目中使用clippy有多種方法,但本節只使用cargo clippy子命令的方式,簡單起見。Clippy可以對代碼進行分析,是一個編譯器插件,可以訪問很多編譯器的內部API。要使用clippy,先運行rustup component add clippy來安裝。
現在,為了演示clippy如何在代碼中指出一些寫的不怎樣的地方,我們在之前寫過的myexponent 的crate中的pow函數里面的if條件中加入了一些爛語句。
如下所示:
// myexponent/src/lib.rs
pub fn pow(base: i64, exponent: usize) -> i64 {
/// Dummy code for clippy demo
let x = true;
if x == true {
}
///
let mut res = 1;
if exponent == 0 {
return 1;
}
for _ in 0..exponent {
res *= base as i64;
}
res
}
#[cfg(test)]
mod tests {
use super::pow;
#[test]
fn minus_two_raised_three_is_minus_eight() {
assert_eq!(pow(-2, 3), -8);
}
}
此時,我們運行cargo clippy
代碼對應結果如下:
不難看出,顯然是說添加的語句寫的太多余了,“equality checks against true are unnecessary”,并給出了改進建議“ try simplifying it as shown: `x`”。
以此可以看出,clippy還是有使用價值的,可以指出我們代碼上的潛在錯誤和不當之處。更多的實例,可以參見:https://rust-lang-nursery.github.io/rust-clippy/master/index.html#absurd_extreme_comparisons?rust-lang-nursery.github.io
有關clippy多種方式的配置,可以直接去https://github.com/rust-lang/rust-clippy?github.com
結語
本篇所介紹的都是在現階段比較有用的工具,同時也是后續篇章的基礎。
下一篇,會探索一下Cargo的項目清單文件cargo.toml,而后再說一下如何用vscode創建一個Rust的開發環境。
主要參考和建議讀者進一步閱讀的文獻The Rust Programming Language?doc.rust-lang.org
Rust編程之道,2019, 張漢東
The Complete Rust Programming Reference Guide,2019, Rahul Sharma,Vesa Kaihlavirta,Claus Matzinger
Hands-On Data Structures and Algorithms with Rust,2018,Claus Matzinger
Beginning Rust ,2018,Carlo Milanesi
Rust Cookbook,2017,Vigneshwer Dhinakaran
總結
以上是生活随笔為你收集整理的rust门卡有什么用_Rust能力养成之(10)用Cargo进行项目管理:扩展 调用与优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql innodb count_M
- 下一篇: xtrabackup备份mysql_配置