Rust でCLIツールを作って公開する(qrcoder)
はじめに
Rust、使いたいですよね。
というわけで、CLIツールをRustを使って作成し、そこからcrates.ioで公開してみました。
その流れを書いておこうと思います。
開発したツール↓
QRコード生成ツール
今回は、入力された文字列からQRコードを生成して画面に表示するツールを作成しました。
とっさに http://ishenrykissingerdead.com/ [1]につながるQRコードを作成できたりしたらピンチに陥ったときに便利そうだと思ったからです。
完成品
作成したのは、ターミナルからqrcoder
コマンドを実行するとウインドウが立ち上がってQRコードが表示されるというコマンドです。
qrcoder https://example.com
crates.ioに公開しているので、cargoが使えれば以下のコマンドですぐ導入できます。
cargo install qrcoder
マニュアルは以下の通りです。(ツールの--help
コマンドより)
CLI tool that generates a QR code from a given string.
Usage: qrcoder [OPTIONS] <WORD>
Arguments:
<WORD> The word you want to encode
Options:
-o, --output <OUTPUT> Output filename (.png)
-h, --help Print help
-V, --version Print version
単にqrcoder <WORD>
と実行すると、 WORDの内容がエンコードされたQRコードが画面上に表示されます。
--output
オプションを指定すると、指定した名前のpngファイルとしてQRコードを保存します。
開発経過
引数をパース
CLIツールを作成するため、clap
で引数をパースできるようにします。引数は以下のように定義した構造体でパースできます。ここは公式のexampleを参考に作成しました。
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
#[arg(help = "The word you want to encode")]
word: String,
#[arg(short, long, help = "Output filename (.png)")]
output: Option<String>,
}
ここでは、word
という位置引数とoutput
というオプションを定義しています。
構造体上でOption<T>
としてアイテムを定義すると、コマンド上でもオプションとして定義されます。
arg
アトリビュート内で指定することで、オプションのshort(-o
)とlong(--output
)もかんたんに設定することができます。
コマンドの処理を実装
あとはコマンドの具体的な処理を実装します。引数の値は
let args = Args::parse();
のようにして取得できます。
本記事では実装の詳細は割愛します。qrcode_generatorクレートを使って書きました。
Cargo.toml
を記述
実装が完了したら後はpublishです。それにあたり、Cargo.toml
にパッケージの情報を定義します。[2]
[package]
name = "qrcoder"
version = "0.2.1"
edition = "2021"
license = "MIT"
description = "CLI tool that generates a QR code from a given string."
readme = "README.md"
homepage = "https://github.com/tenax66/qrcoder"
repository = "https://github.com/tenax66/qrcoder"
keywords = ["cli", "Rust"]
categories = ["command-line-utilities"]
設定可能な情報はThe Cargo Bookの3.2. The Manifest Format で確認できます。
crates.ioに公開
では、ツールをcrates.ioに公開しましょう。
公開にはcargo publish
コマンドを使用します。
いきなり公開するのではなく
cargo publish --dry-run
を実行することで、実際にはアップロードせずにpublish前のチェックをすることができます。
チェックが通れば、
cargo publish
で公開しましょう。
これにより、今後はcargo install qrcoder
でインストールできるようになりました。
おわりに
RustでのCLIツール公開は、cargo
コマンドや公式のレジストリ(crates.io)が整備されているため、かなりやりやすかったです。リッチな型システムやメモリ安全性以外だけでなく、こういった点もすばらしい言語ですね。
それでは、Adiós!
おまけ
保存用
Discussion