🦀

Rust でCLIツールを作って公開する(qrcoder)

2023/12/31に公開

はじめに

Rust、使いたいですよね。
というわけで、CLIツールをRustを使って作成し、そこからcrates.ioで公開してみました。
その流れを書いておこうと思います。

開発したツール↓
https://github.com/tenax66/qrcoder

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!

おまけ

保存用

脚注
  1. このサイト、なぜかは知らないが異常に重い。キッシンジャー(1923-2023)はニクソン政権で国務長官を務め、リアリスト的な外交政策で知られた。 ↩︎

  2. バージョンは記事執筆当時のもの。 ↩︎

Discussion