利用rust實(shí)現(xiàn)一個(gè)命令行工具
本項(xiàng)目會(huì)使用 Rust 和 clap 4.4.0 創(chuàng)建一個(gè)命令行工具 my_dev_tool,先實(shí)現(xiàn) urlencode、urldecode 和時(shí)間戳轉(zhuǎn)換為本地時(shí)間三個(gè)功能。
github開源地址:github.com/maochunguang/my_dev_tool
如果你也想實(shí)現(xiàn)一個(gè)自己的命令行工具,可以按照以下步驟進(jìn)行:
第 1 步:創(chuàng)建項(xiàng)目并添加依賴
創(chuàng)建新的 Rust 項(xiàng)目:在終端中運(yùn)行以下命令:
cargo new my_dev_tool cd my_dev_tool
添加依賴:在 Cargo.toml 中添加 clap、serde、serde_json 和 chrono 作為依賴:
[dependencies] clap = "4.4.0" chrono = "0.4" urlencoding = "2.1"
第 2 步:編寫代碼
在 src/main.rs 中,使用 clap 定義命令行參數(shù)并實(shí)現(xiàn)功能。
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 步:編譯和安裝
編譯項(xiàng)目:
cargo build --release
安裝到系統(tǒng):
在 Linux 或 macOS 上,你可以將編譯后的可執(zhí)行文件復(fù)制到 /usr/local/bin 或其他 PATH 包含的目錄:
sudo cp target/release/my_dev_tool /usr/local/bin/
在 Windows 上,你可以將可執(zhí)行文件復(fù)制到任何 PATH 包含的目錄,或者手動(dòng)添加其所在目錄到系統(tǒng) 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
正常教程到這里就結(jié)束了,但是通過復(fù)制的方法安裝命令行,實(shí)在是low,必須要使用一種裝逼的方式來安裝。因此,下面的步驟才是命令行裝逼的關(guān)鍵,支持cargo安裝。
第5步,支持cargo安裝
要使你的 my_dev_tool 命令行工具能夠通過 cargo install 安裝,你需要將其發(fā)布到 crates.io,這是 Rust 的包管理倉庫。在發(fā)布之前,你需要?jiǎng)?chuàng)建一個(gè)帳戶并獲取一個(gè) API 令牌用于身份驗(yàn)證。以下是將你的工具準(zhǔn)備并發(fā)布到 crates.io 的步驟:
第(1)步:注冊(cè) crates.io 帳戶
- 訪問 crates.io 并注冊(cè)一個(gè)帳戶。
- 登錄后,在 "Account Settings" 中獲取你的 API 令牌。
- 驗(yàn)證自己的郵箱,郵箱只有驗(yàn)證成功才可以publish包。
第(2)步:登錄 Cargo
在你的終端中,使用以下命令登錄 Cargo:
cargo login [your_api_token]
將 [your_api_token] 替換為你在 crates.io 上的 API 令牌。
第(3)步:準(zhǔn)備發(fā)布
確保你的 Cargo.toml 文件包含所有必要的信息,這對(duì)于發(fā)布至 crates.io 是必要的。下面是一個(gè)示例:
[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"
確保更新 authors、description、documentation(如果適用),以及任何其他相關(guān)信息。
第(4)步:發(fā)布到 crates.io
在你的項(xiàng)目目錄中運(yùn)行以下命令來發(fā)布你的包:
cargo publish
這將會(huì)把你的包上傳到 crates.io。
第6步:通過 Cargo 安裝
一旦你的包被成功發(fā)布到 crates.io,其他人就可以通過運(yùn)行以下命令來安裝你的工具:
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
注意事項(xiàng)
- 在發(fā)布之前,請(qǐng)確保代碼和文檔是清晰和完整的,這對(duì)于其他人使用你的工具非常重要。
- 你需要更新版本號(hào)(在
Cargo.toml中的version字段)在每次發(fā)布新的更改時(shí)。 - 如果你的工具包含敏感或?qū)S行畔?,?qǐng)?jiān)诎l(fā)布前仔細(xì)檢查。
以上就是利用rust實(shí)現(xiàn)一個(gè)命令行工具的詳細(xì)內(nèi)容,更多關(guān)于rust實(shí)現(xiàn)命令行工具的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Rust生命周期之驗(yàn)證引用有效性與防止懸垂引用方式
本文介紹了Rust中生命周期注解的應(yīng)用,包括防止懸垂引用、在函數(shù)中使用泛型生命周期、生命周期省略規(guī)則、在結(jié)構(gòu)體中使用生命周期、靜態(tài)生命周期以及如何將生命周期與泛型和特質(zhì)約束結(jié)合,通過這些機(jī)制,Rust在編譯時(shí)就能捕獲內(nèi)存安全問題2025-02-02
使用Cargo工具高效創(chuàng)建Rust項(xiàng)目
這篇文章主要介紹了使用Cargo工具高效創(chuàng)建Rust項(xiàng)目,本文有關(guān)Cargo工具的使用和Rust輸入輸出知識(shí)感興趣的朋友一起看看吧2022-08-08

