Rust能力養成之(10)用Cargo進行專案管理:擴充套件 呼叫與優化
前言
上一篇我們講了
-
Cargo執行測試
-
Cargo執行例項
-
Cargo工作空間
當然,Cargo也能夠進行擴充套件,合併外部工具以增強開發體驗,在設計上,其可擴充套件性已經達到非常豐富和恰當的程度。Cargo可以通過簡單的二進位制名稱(binary-name)語法呼叫開發人員所建立的命令列工具。
在這一節中,我們就來看看其中的一些經常用得上的工具來幫助我們提升程式碼的編寫效率和可讀性。
那麼本篇內容涉及
-
子命令定製與安裝
-
用 Clippy來 Linting 程式碼
子命令定製與安裝
為Cargo定製化命令列工具在結構上歸為Cargo的子命令(subcommands)範疇。這些工具通常是二進位制檔案,主要來自於crate.io
下面我們看一個例項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
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
pubfnpow(base:i64,exponent:usize)->i64{
///Dummycodeforclippydemo
letx=true;
ifx==true{
}
///
letmutres=1;
ifexponent==0{
return1;
}
for_in0..exponent{
res*=baseasi64;
}
res
}
#[cfg(test)]
modtests{
usesuper::pow;
#[test]
fnminus_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
有關clippy多種方式的配置,可以直接去
https://github.com/rust-lang/rust-clippy。
結語
本篇所介紹的都是在現階段比較有用的工具,同時也是後續篇章的基礎。
下一篇,會探索一下Cargo的專案清單檔案cargo.toml,而後再說一下如何用vscode建立一個Rust的開發環境。
主要參考和建議讀者進一步閱讀的文獻
https://doc.rust-lang.org/book
1.Rust程式設計之道,2019, 張漢東
2.The Complete Rust Programming Reference Guide,2019, Rahul Sharma,Vesa Kaihlavirta,Claus Matzinger
3.Hands-On Data Structures and Algorithms with Rust,2018,Claus Matzinger
4.Beginning Rust ,2018,Carlo Milanesi
5.Rust Cookbook,2017,Vigneshwer Dhinakaran