利用Rust生产力工具,构建高效的Rust开发环境

发表时间: 2024-02-27 08:38



当谈到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 imagelet 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 (, , )",&[&"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 flamegraphcargo install cargo-flamegraph

完成后,就可以使用cargo flamegraph生成火焰图,svg格式。可以使用浏览器或SVG查看。

Cargo插件

Cargo是Rust开发生态系统中最重要的部分。Cargo提供了拥有广泛插件(官方和第三方)可以用来加速我们的开发。Cargo插件可以作为CLI 命令以及CI指令令用来在CI工具中实现自动化。

cargo-edit

Edit插件允许用户Cargo.toml文件中添加、删除和更新依赖项。它提供了一种简单的方式来管理项目的依赖关系。

安装插件:

cargo install cargo-edit

添加依赖项:

cargo add serde

删除依赖项:

cargo rm serde

cargo-make

cargo-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 = ["WC: ${VALUE}"]

如果运行

WC=HELLO_ChongChong

cargo make expand

则会打印:

WC: HELLO_ChongChong

cargo-make对于Rusty命令运行程序来说非常有用。

cargo-nextest

nextest自诩为“下一代Rust测试运行程序”。

运行

cargo install cargo-nextest

安装,安装后在项目目录(或工作区),可以使用以下命令运行测试

cargo nextest run

或使用

cargo nextest list

和cargo test测试运行程序主要区别为cargo-nextest可以泄漏测试、片化测试,也支持和Junit集成。

针对测试中可以能的延迟和其他需要规避的项目可以进行专门配置来提高测试的效率。

cargo-audit

rust安全很重要。cargo-audit是一个简单的Cargo工具,用于检测项目中存在安全问题Rust板条箱。运行该命令结果类似如下:

除了检查安全漏洞,cargo-audit还支持支持自动更新(实验性功能),用来修复存在问题的依赖项。

可通过

cargo install cargo-audit --features=fix

要启用安装后,然后运行

cargo audit fix

既可以自动修复Cargo.toml中存在安全问题的依赖项

另外也支持对于二进制包,以及和CI工具集成实现自动化。

总结

随着Rust越来越流行,其生态系统不对扩展和完善,越来越多、越来越好用的工具在不断涌现。本文我们只是列举了Rust开发生产力工具的冰山一角,至于更多更好的工具,希望本文抛砖引玉,大家可以共享自己喜欢的、好用的、好玩的工具出来,一起交流讨论。