當談到Rust時,有一個廣泛的庫包(crate,板條箱)生態系統可以幫助Rustaceans快速構建自己的應用系統。除此之外尚有一些Cargo插件和開發工具可以幫助我們提高Rust開發效率。“工欲善其事,必先利其器”,“磨刀不誤砍柴工”打造一個高效的Rust開發棧是我們今天文章的主題。
Rust-analyzer首先要說的是rust-analyzer。它是一種語言服務器協議(LSP),可與任何支持它的編輯器集成,並允許編輯器通過維護與LSP服務器的連接來主動指出錯誤。可以使用以下任一方式安裝:
rustup component add rust-analyzer
或者也可以通過編輯器擴展菜單(例如VSCode擴展)提供。
對于一個開發者來說調試錯誤是最重要的,彰顯出了rust-analyzer的可貴之處,有其對于第三方的編輯器(比如VSCode)只有在添加rust-analyzer的插件情況下,才可以實現完整的IDE功能,無需編譯的實時調試以及自動完成可以讓Rust開發變得更加輕松。
testcontainers對于開發者來說,最棘手不是寫代碼,而是進行軟件測試。Testcontainers提供了一個開源框架爲應用程序提供本地、輕量級容器,這些容器在使用後可以立即丟棄。Testcontainers提供Java,Go,Python等常見語言的,當然也包括Rust,還提供Rust原生板條箱包,可以使用cargo add將其一鍵添加到項目:
cargo add testcontainers
然後只需添加一個依賴項testcontainers-modules以及想要的功能(對于想要使用的容器)。比如要使用Postgres數據庫,則對應添加
cargo add testcontainers-modules -F postgres
要實現應用程序測試,先將其實例化客戶端並通過將以下代碼添加到測試中來運行Postgres容器(integration_test.rs):
...
#[test]
async fn it_works() {
let docker = clients::Cli::default();
// Define a PostgreSQL container image
let postgres_image = Postgres::default();
let pg_container = docker.run(postgres_image);
pg_container.start();
WaitFor::seconds(60);
// 定義PostgreSQL端口(5432)
let pg_port = pg_container.get_host_port_ipv4(5432);
// 定義Postgress鏈接參數
let (client, connection) = tokio_postgres::Config::new()
.user("postgres")
.password("postgres")
.host("localhost")
.port(pg_port)
.dbname("test")
.connect(tokio_postgres::NoTls)
.await
.unwrap();
tokio::spawn(async move {
if let Err(error) = connection.await {
eprintln!("Connection error: {}", error);
}
});
let _ = client
.batch_execute(
"
CREATE TABLE IF NOT EXISTS app_user (
id SERIAL PRIMARY KEY,
username VARCHAR UNIQUE NOT NULL,
password VARCHAR NOT NULL,
email VARCHAR UNIQUE NOT NULL
)
",
)
.await;
let _ = client
.execute(
"INSERT INTO app_user (username, password, email) VALUES ($1, $2, $3)",
&[&"user1", &"mypass", &"chongchong@chongchong"],
)
.await;
let result = client
.query("SELECT id, username, password, email FROM app_user", &[])
.await
.unwrap();
let users: Vec<User> = result.into_iter().map(|row| User::from(row)).collect();
let user = users.first().unwrap();
assert_eq!(1, user.id);
assert_eq!("user1", user.username);
assert_eq!("mypass", user.password);
assert_eq!(" chongchong@chongchong", user.email);
}
通過以下命令當運行此測試實例
cargo test --test integration_test
將通過Docker自動創建一個Postgres容器,然後連接到Postgres實例並執行測試。測試完成後,容器將被刪除。
火焰圖Rust開發的應用大多數對性能要求比較嚴苛,所以發現應用中的性能問題是一個常見的難點。解決性能問題最好工具是火焰圖,火焰圖通過跟蹤系統請求,並對其可視化來找到系統的性能瓶頸。火焰圖最初是由Perl開發屆首創可以應用並被其他語言和系統做借鑒山寨,當然Rust中也借鑒了這個強大的工具,cargo-flamegraph板條箱就是rust生態下用于生成火焰圖的程序。通過使用火焰圖,可以更輕松地查看錯誤(例如,競爭條件)可能源自何處或可能存在內存泄漏的位置。通過常規日志記錄難以調試的異常高延遲或錯誤等問題可以通過火焰圖更輕松地解決。
cargo-flamegraph安裝可通過
cargo install flamegraph
cargo install cargo-flamegraph
完成後,就可以使用cargo flamegraph生成火焰圖,svg格式。可以使用浏覽器或SVG查看。
Cargo插件Cargo是Rust開發生態系統中最重要的部分。Cargo提供了擁有廣泛插件(官方和第三方)可以用來加速我們的開發。Cargo插件可以作爲CLI 命令以及CI指令令用來在CI工具中實現自動化。
cargo-editEdit插件允許用戶Cargo.toml文件中添加、刪除和更新依賴項。它提供了一種簡單的方式來管理項目的依賴關系。
安裝插件:
cargo install cargo-edit
添加依賴項:
cargo add serde
刪除依賴項:
cargo rm serde
cargo-makecargo-make用來實現 Rust下的任務自動運行工具。cargo-make允許定義工作流程來執行任務。一個典型的例子Makefile.toml配置如下:
[tasks.format]
install_crate = "rustfmt"
command = "cargo"
args = ["fmt", "--", "--emit=files"]
[tasks.lint]
install_crate = "rust-clippy"
command = "cargo"
args = ["clippy"]
[tasks.fmtclip]
dependencies = [
"format",
"lint"
]
cargo make fmtclip
會自動運行cargo fmt和cargo clippy。
還可以通過通常的方式將環境變量添加到make命令中。 例如,如果有一個 Makefile.toml看起來像這樣:
[env]
ECHO_CMD = "echo"
[tasks.expand]
command = "${ECHO_CMD}"
args = [
"VALUE: ${VALUE}"
]
如果運行
VALUE=HELLO_ChongChong
cargo make expand
則會打印:
VALUE: HELLO_ChongChong
cargo-make對于Rusty命令運行程序來說非常有用。
cargo-nextestnextest自诩爲“下一代Rust測試運行程序”。
運行
cargo install cargo-nextest
安裝,安裝後在項目目錄(或工作區),可以使用以下命令運行測試
cargo nextest run
或使用cargo nextest list
和cargo test測試運行程序主要區別爲cargo-nextest可以泄漏測試、片化測試,也支持和Junit集成。
針對測試中可以能的延遲和其他需要規避的項目可以進行專門配置來提高測試的效率。
cargo-auditrust安全很重要。cargo-audit是一個簡單的Cargo工具,用于檢測項目中存在安全問題Rust板條箱。運行該命令結果類似如下:
除了檢查安全漏洞,cargo-audit還支持支持自動更新(實驗性功能),用來修複存在問題的依賴項。
可通過
cargo install cargo-audit --features=fix
要啓用安裝後,然後運行
cargo audit fix
既可以自動修複Cargo.toml中存在安全問題的依賴項
另外也支持對于二進制包,以及和CI工具集成實現自動化。
總結隨著Rust越來越流行,其生態系統不對擴展和完善,越來越多、越來越好用的工具在不斷湧現。本文我們只是列舉了Rust開發生産力工具的冰山一角,至于更多更好的工具,希望本文抛磚引玉,大家可以共享自己喜歡的、好用的、好玩的工具出來,一起交流討論。
小編是程序員嗎?還是盜圖的[呲牙笑][呲牙笑]