命令行应用

为何选择 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,《Rust at Sentry – PolyConf 2017


我非常乐意在这个代码库中工作,毫不后悔。[…]这对我来说算是意外之喜:使用 Rust 制作 CLI 或基于控制台的工具。它非常擅长为不同的目标系统进行编译。

—— Fletcher Nichol,《将 Rust 应用于生产环境 – RustFest Kyiv

Habitat logo