命令行应用

为什么选择 Rust?

Shield with a checkmark

稳定且快速

即使你只是编写一个简短的一次性脚本,你也可以确信它运行速度快、易于测试,并能提供有用的输出。

Rust 的保证
box with a checkmark

易于分发

将所有内容编译成一个单独的二进制文件——不需要用户安装运行时或库。

如何发布 Rust 代码
A note and a gear

健壮的配置

轻松处理跨平台的配置文件。Rust 会为你处理命名空间和格式。

开始配置
Help manual

手册?搞定。

自动为你的应用程序生成手册页。只需打包生成的文件即可。

了解如何操作
Pipes

数据输入,数据输出

除了与人类交流,Rust 还有很好的工具来帮助你与机器交流。

与机器通信
3 wood logs stacked on top of each other

灵活的日志

添加日志很容易,而且更容易将其配置为不同的目标和不同的样式。

记录、跟踪、理解

可维护的代码库

cli app structure

现在捕获错误

如果配置文件丢失或损坏怎么办?如果某个环境变量的内容为空怎么办?这些情况很容易被遗忘!但是,由于其错误处理方法和库设计,Rust 会在你运行程序之前指出这些“如果”情况。

Rust 的错误处理
cli is no rocket science

易于后续扩展

Rust 允许你在组织代码的方式上具有灵活性。从单个文件开始,当你需要更多功能时,你可以放心地重构你的应用程序,而不用担心会破坏任何东西。

重构 Rust

开始吧!

编写命令行应用程序是学习 Rust 的绝佳方式。

定义你的输入

use clap::Parser;

/// Read some lines of a file
#[derive(Debug, Parser)]
struct Cli {
    /// Input file to read
    file: String,
    /// Number of lines to read
    #[structopt(short = 'n')]
    num: usize,
}

编写你的工具

use std::{error::Error, fs::read_to_string};

fn main() -> Result<(), Box> {
    let args = Cli::parse();
    read_to_string(&args.file)?
        .lines()
        .take(args.num)
        .for_each(|line| println!("{}", line));
    Ok(())
}
通过 CLI 书籍了解更多信息

生产环境使用

sentry logo
我们喜欢 Rust 的原因之一是 crates.io 生态系统。[...] 有很多非常好的现有基础设施,可以用来构建非常好的命令行界面。

– Armin Ronacher, Sentry 的 Rust – PolyConf 2017


我对使用这个代码库没有任何遗憾。[…] 这对我来说算是一个额外的奖励:使用 Rust 来制作 CLI 或基于控制台的工具。它非常擅长为不同的目标系统进行编译。

– Fletcher Nichol, 将 Rust 投入生产 – RustFest Kyiv

Habitat logo