利用rust实现一个命令行工具

 更新时间:2023年12月17日 08:25:01   作者:tommy_1  
这篇文章主要为大家详细介绍了如何使用 Rust 和 clap 4.4.0 创建一个命令行工具 my_dev_tool,文中的示例代码讲解详细,需要的小伙伴可以参考下

本项目会使用 Rust 和 clap 4.4.0 创建一个命令行工具 my_dev_tool,先实现 urlencode、urldecode 和时间戳转换为本地时间三个功能。

github开源地址:github.com/maochunguang/my_dev_tool

如果你也想实现一个自己的命令行工具,可以按照以下步骤进行:

第 1 步:创建项目并添加依赖

创建新的 Rust 项目:在终端中运行以下命令:

cargo new my_dev_tool
cd my_dev_tool

添加依赖:在 Cargo.toml 中添加 clapserdeserde_json 和 chrono 作为依赖:

[dependencies]
clap = "4.4.0"
chrono = "0.4"
urlencoding = "2.1"

第 2 步:编写代码

在 src/main.rs 中,使用 clap 定义命令行参数并实现功能。

use clap::{Arg, ArgMatches, Command};
use chrono::{Local, TimeZone};
use urlencoding::{decode, encode};

fn main() {
    let matches = Command::new("my_dev_tool")
        .version("1.0")
        .author("Your Name <your.email@example.com>")
        .about("Developer's tool for urlencode and time format!")
        .subcommand_required(true)
        .arg_required_else_help(true)
        .subcommand(
            Command::new("urlencode")
                .about("URL-encode a string")
                .arg(Arg::new("input").help("String to encode").required(true)),
        )
        .subcommand(
            Command::new("urldecode")
                .about("URL-decode a string")
                .arg(Arg::new("input").help("String to decode").required(true)),
        )
        .subcommand(
            Command::new("timestamp")
                .about("Convert a UNIX timestamp to local datetime")
                .arg(Arg::new("timestamp").help("UNIX timestamp").required(true)),
        )
        .get_matches();

    match matches.subcommand() {
        Some(("urlencode", sub_matches)) => url_encode(sub_matches),
        Some(("urldecode", sub_matches)) => url_decode(sub_matches),
        Some(("timestamp", sub_matches)) => convert_timestamp(sub_matches),
        _ => unreachable!(),
    }
}

fn url_encode(matches: &ArgMatches) {
    if let Some(input) = matches.get_one::<String>("input") {
        println!("{}", encode(input));
    }
}

fn url_decode(matches: &ArgMatches) {
    if let Some(input) = matches.get_one::<String>("input") {
        println!("{}", decode(input).unwrap());
    }
}

fn convert_timestamp(matches: &ArgMatches) {
    if let Some(timestamp_str) = matches.get_one::<String>("timestamp") {
        let timestamp = timestamp_str.parse::<i64>().unwrap();
        let datetime = Local.timestamp_opt(timestamp, 0).unwrap();
        println!("{}", datetime.to_rfc3339());
    }
}

第 3 步:编译和安装

编译项目

cargo build --release

安装到系统

在 Linux 或 macOS 上,你可以将编译后的可执行文件复制到 /usr/local/bin 或其他 PATH 包含的目录:

sudo cp target/release/my_dev_tool /usr/local/bin/

在 Windows 上,你可以将可执行文件复制到任何 PATH 包含的目录,或者手动添加其所在目录到系统 PATH。

第 4 步:使用工具

一旦安装,你就可以直接在命令行中使用 my_dev_tool,例如:

my_dev_tool urlencode "https://example.com"
my_dev_tool urldecode "https%3A%2F%2Fexample.com"
my_dev_tool timestamp 1609459200

正常教程到这里就结束了,但是通过复制的方法安装命令行,实在是low,必须要使用一种装逼的方式来安装。因此,下面的步骤才是命令行装逼的关键,支持cargo安装。

第5步,支持cargo安装

要使你的 my_dev_tool 命令行工具能够通过 cargo install 安装,你需要将其发布到 crates.io,这是 Rust 的包管理仓库。在发布之前,你需要创建一个帐户并获取一个 API 令牌用于身份验证。以下是将你的工具准备并发布到 crates.io 的步骤:

第(1)步:注册 crates.io 帐户

  • 访问 crates.io 并注册一个帐户。
  • 登录后,在 "Account Settings" 中获取你的 API 令牌。
  • 验证自己的邮箱,邮箱只有验证成功才可以publish包。

第(2)步:登录 Cargo

在你的终端中,使用以下命令登录 Cargo:

cargo login [your_api_token]

将 [your_api_token] 替换为你在 crates.io 上的 API 令牌。

第(3)步:准备发布

确保你的 Cargo.toml 文件包含所有必要的信息,这对于发布至 crates.io 是必要的。下面是一个示例:

[package]
name = "my_dev_tool"
version = "0.1.0"
authors = ["Your Name <youremail@example.com>"]
edition = "2018"

# 以下是描述和文档链接等可选字段
description = "A useful development tool for various tasks"
documentation = "https://example.com/my_dev_tool/docs"
license = "MIT OR Apache-2.0"

[dependencies]
clap = "3.0"
chrono = "0.4"
urlencoding = "2.1"

确保更新 authorsdescriptiondocumentation(如果适用),以及任何其他相关信息。

第(4)步:发布到 crates.io

在你的项目目录中运行以下命令来发布你的包:

cargo publish

这将会把你的包上传到 crates.io。

第6步:通过 Cargo 安装

一旦你的包被成功发布到 crates.io,其他人就可以通过运行以下命令来安装你的工具:

cargo install my_dev_tool

展示成果

% cargo install my_dev_tool
    Updating crates.io index
  Downloaded my_dev_tool v0.1.0
  Downloaded 1 crate (10.7 KB) in 2.64s
  Installing my_dev_tool v0.1.0
    Updating crates.io index
   Compiling autocfg v1.1.0
   Compiling utf8parse v0.2.1
   Compiling anstyle-query v1.0.0
   Compiling colorchoice v1.0.0
   Compiling anstyle v1.0.4
   Compiling strsim v0.10.0
   Compiling clap_lex v0.6.0
   Compiling iana-time-zone v0.1.58
   Compiling urlencoding v2.1.3
   Compiling anstyle-parse v0.2.2
   Compiling anstream v0.6.4
   Compiling num-traits v0.2.17
   Compiling clap_builder v4.4.8
   Compiling chrono v0.4.31
   Compiling clap v4.4.8
   Compiling my_dev_tool v0.1.0
    Finished release [optimized] target(s) in 7.84s
  Installing /home/maocg/.cargo/bin/my_dev_tool
   Installed package `my_dev_tool v0.1.0` (executable `my_dev_tool`)

% my_dev_tool timestamp 1609459200
2021-01-01T08:00:00+08:00

注意事项

  • 在发布之前,请确保代码和文档是清晰和完整的,这对于其他人使用你的工具非常重要。
  • 你需要更新版本号(在 Cargo.toml 中的 version 字段)在每次发布新的更改时。
  • 如果你的工具包含敏感或专有信息,请在发布前仔细检查。

以上就是利用rust实现一个命令行工具的详细内容,更多关于rust实现命令行工具的资料请关注脚本之家其它相关文章!

相关文章

  • Rust在写库时实现缓存的操作方法

    Rust在写库时实现缓存的操作方法

    Moka是一个用于Rust的高性能缓存库,它提供了多种类型的缓存数据结构,包括哈希表、LRU(最近最少使用)缓存和 支持TTL(生存时间)缓存,这篇文章给大家介绍Rust在写库时实现缓存的相关知识,感兴趣的朋友一起看看吧
    2024-01-01
  • 关于Rust 使用 dotenv 来设置环境变量的问题

    关于Rust 使用 dotenv 来设置环境变量的问题

    在项目中,我们通常需要设置一些环境变量,用来保存一些凭证或其它数据,这时我们可以使用dotenv这个crate,接下来通过本文给大家介绍Rust 使用dotenv来设置环境变量的问题,感兴趣的朋友一起看看吧
    2022-01-01
  • Rust获取命令行参数及IO操作方法

    Rust获取命令行参数及IO操作方法

    Rust作为一门系统编程语言,提供了强大且安全的I/O操作支持,本文给大家介绍Rust获取命令行参数以及IO操作,感兴趣的朋友一起看看吧
    2025-06-06
  • Rust中的Option枚举快速入门教程

    Rust中的Option枚举快速入门教程

    Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事项,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • 使用Rust制作康威生命游戏的实现代码

    使用Rust制作康威生命游戏的实现代码

    这篇文章主要介绍了使用Rust制作康威生命游戏,初始rust项目,使用wasm的项目模板,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Rust中的宏之声明宏和过程宏详解

    Rust中的宏之声明宏和过程宏详解

    Rust中的宏是一种强大的工具,可以帮助开发人员编写可重用、高效和灵活的代码,这篇文章主要介绍了Rust中的宏:声明宏和过程宏,需要的朋友可以参考下
    2023-04-04
  • Rust调用函数操作符 . 和 :: 的区别详解

    Rust调用函数操作符 . 和 :: 的区别详解

    在Rust中,.和::操作符都可以用来调用方法,但它们的用法有所不同,所以本文就将详细的给大家介绍一下.和::操作符的区别,感兴趣的同学跟着小编一起来学习吧
    2023-07-07
  • Rust异步Web框架Axum的深入原理解析与高级用法

    Rust异步Web框架Axum的深入原理解析与高级用法

    Axum是一个功能强大、简单易用的异步Web框架,基于Tokio异步运行时,具有高度模块化的架构和类型安全的特点,通过本文的介绍,我们学习了Axum框架的架构与核心组件、路由系统、高级功能、性能优化方法、实战项目的应用以及常见问题的解决方案
    2026-03-03
  • 为什么 Rust 没有空指针

    为什么 Rust 没有空指针

    在许多编程语言中,默认都是有空指针类型的,而 Rust 参考 Haskell 在语言层面彻底消灭空指针概念,从而从根源上消除了空指针异常这个运行时错误,下面就来详细的了解一下
    2026-05-05
  • Rust HashMap详解及单词统计示例用法详解

    Rust HashMap详解及单词统计示例用法详解

    HashMap在Rust中是一个强大的工具,通过合理使用可以简化很多与键值对相关的问题,在实际开发中,我们可以充分利用其特性,提高代码的效率和可读性,本文将深入介绍HashMap的特性,以及通过一个单词统计的例子展示其用法,感兴趣的朋友一起看看吧
    2024-02-02

最新评论