CLI фреймворки для Rust: обзор лучших инструментов для создания утилит командной строки

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

CLI фреймворки для Rust: мощные инструменты для создания консольных приложений

Rust — это язык системного программирования, который набирает популярность благодаря своей производительности, безопасности и современным возможностям. Одно из самых распространённых применений Rust — создание утилит командной строки (CLI). От ripgrep до bat и fd — многие известные инструменты написаны на Rust. В этой статье мы рассмотрим основные CLI фреймворки для Rust, которые помогут вам быстро и качественно разрабатывать собственные консольные приложения.

Почему стоит выбрать Rust для CLI?

Rust предлагает несколько ключевых преимуществ для разработки CLI:

  • Быстродействие — компилируемый код работает с минимальными накладными расходами.
  • Безопасность памяти — система владения (ownership) предотвращает утечки и гонки данных.
  • Кроссплатформенность — одна кодовая база работает на Windows, macOS и Linux.
  • Экосистема — богатый набор библиотек для парсинга аргументов, цветного вывода, работы с конфигами.

Основные CLI фреймворки для Rust

1. Clap (Command Line Argument Parser)

Clap — самый популярный и функциональный фреймворк для парсинга аргументов командной строки в Rust. Он поддерживает автоматическую генерацию справки, подсказки, валидацию, подкоманды и многое другое.

use clap::{Parser, Subcommand};

#[derive(Parser)]
#[command(name = "git")]
#[command(about = "A fictional version of git", long_about = None)]
struct Cli {
    #[command(subcommand)]
    command: Commands,
}

#[derive(Subcommand)]
enum Commands {
    /// Clone a repository
    Clone {
        /// URL of the repository
        url: String,
    },
    /// Push changes
    Push {
        /// Remote name
        remote: String,
        /// Branch name
        branch: String,
    },
}

fn main() {
    let cli = Cli::parse();
    match &cli.command {
        Commands::Clone { url } => println!("Cloning from {}", url),
        Commands::Push { remote, branch } => println!("Pushing to {} branch {}", remote, branch),
    }
}

Clap предоставляет два подхода: декларативный (через derive-макросы) и функциональный (через Builder API). Для большинства проектов рекомендуется использовать derive-подход — он короче и читаемее.

2. StructOpt

StructOpt — это надстройка над Clap, которая позволяет определять аргументы через структуры. Начиная с версии 3.0, Clap встроил функциональность StructOpt напрямую, поэтому сейчас StructOpt считается устаревшим. Однако многие старые проекты всё ещё его используют.

use structopt::StructOpt;

#[derive(StructOpt)]
struct Cli {
    #[structopt(short = 'n', long = "name")]
    name: String,
    #[structopt(short = 'c', long = "count", default_value = "1")]
    count: u32,
}

fn main() {
    let args = Cli::from_args();
    for _ in 0..args.count {
        println!("Hello, {}!", args.name);
    }
}

Важно: для новых проектов используйте Clap с derive-макросами — это современная и поддерживаемая альтернатива.

3. Argh

Argh — лёгкий и быстрый фреймворк, который фокусируется на минимализме. Он не требует дополнительных зависимостей (кроме самого себя) и компилируется очень быстро. Идеально подходит для небольших утилит.

use argh::FromArgs;

#[derive(FromArgs)]
/// A simple greeting tool
struct Greeting {
    /// name to greet
    #[argh(option, short = 'n')]
    name: String,

    /// number of times to greet
    #[argh(option, short = 'c', default = "1")]
    count: u32,
}

fn main() {
    let greeting: Greeting = argh::from_env();
    for _ in 0..greeting.count {
        println!("Hello, {}!", greeting.name);
    }
}

Argh поддерживает только derive-подход и не предоставляет Builder API. Это осознанное решение разработчиков — сохранять библиотеку простой и предсказуемой.

4. clap-verbosity-flag

Это вспомогательная библиотека, которая расширяет Clap поддержкой флагов уровня детализации (-v, -vv, -q). Она автоматически настраивает логирование через env_logger или log.

use clap::Parser;
use clap_verbosity_flag::Verbosity;

#[derive(Parser)]
struct Cli {
    #[command(flatten)]
    verbose: Verbosity,
}

fn main() {
    let cli = Cli                    

Рекомендаций