お手軽CLIツール作成
この記事は群馬高専アドベントカレンダー2021の19日目です。
自分の好きなRustを使うことでお手軽にハイクオリティなクロスプラットフォームのCLIツールが作れるのでこれを機に紹介させていただこうと思います。
自己紹介
4Jのなまちゃです。
浅く広くいろいろなものに手を出して開発しています。 好きな言語はRustで、Rustを使って競技プログラミングを少しやっています。
サンプル
最近作ったツールがあるのでそれをサンプルに説明します。
サンプルのツールを軽く紹介すると、 競プロ用のテンプレートがあらかじめ書かれたファイルをフォルダにしてコンテスト用のファルダを作成するツールです。
サンプルのソースコードはこちらになります。 https://github.com/Namacha411/kyoprofolder
Rustで作る理由
- パフォーマンスがよく、C、C++と同等の速度で実行できる
- コンパイル時にほとんどのバグを排除できる
- パッケージマネージャーが便利で優秀
- クレート(ライブラリ)が豊富
- 配布が簡単
- クロスプラットフォームで動作する
が大きな理由としてあります。
おすすめライブラリ
StructOpt
RustでCLIツールを作るとき、 代表的なライブラリがStructOptです。 めちゃくちゃ便利です。
これを使うと、以下のように構造体を定義しただけで、
#[derive(StructOpt)] #[structopt(name = "kyopro folder")] #[structopt(setting(clap::AppSettings::ColoredHelp))] struct Opt { /// Folder name folder_name: String, /// Programing language lang: String, /// File names srcs: Vec<String>, }
コマンドライン引数を構造体に従ってパースを行い、 以下のような説明を自動生成してくれます。 引数がマッチしない場合などのエラーも自動的に行ってくれます。
kyopro folder 0.1.0 USAGE: kf <folder-name> <lang> [srcs]... FLAGS: -h, --help Prints help information -V, --version Prints version information ARGS: <folder-name> Folder name <lang> Programing language <srcs>... File names
dirs-rs
クロスプラットフォームで実行できるようにし、 設定ファイルなどの作成・読み込みを行いたいときおすすめなのがこのdirs-rsです。
これを使うとめんどくさいパス周りをOSにあわせて変更してくれるため、
設定ファイルを作りたいといった時でも使用先のOSを考えることなく、
config_dir
と書いておけばよく楽です。
READMEにそれぞれのOSごとのリストがあり、 わかりやすくまとめられているため、 何かあった時でも対応しやすくなっています。
Function name | Value on Linux/Redox | Value on Windows | Value on macOS |
---|---|---|---|
home_dir |
Some($HOME) |
Some({FOLDERID_Profile}) |
Some($HOME) |
cache_dir |
Some($XDG_CACHE_HOME) or Some($HOME /.cache) |
Some({FOLDERID_LocalAppData}) |
Some($HOME /Library/Caches) |
config_dir |
Some($XDG_CONFIG_HOME) or Some($HOME /.config) |
Some({FOLDERID_RoamingAppData}) |
Some($HOME /Library/Application Support) |
配布
パッケージマネージャーであるcargoを使って、
cargo publish
でできるらしいですが、なんか怖くてやったことないし、若干めんどくさそうなのでこちらは省略します。
そこでおすすめしたいのが、GitHubなどのGitサーバーへの公開です。 こうすることで利用者側は、
cargo install --git <URL>
とリポジトリのURLを入力するだけでインストールできるようになります。
最後に
Rustは学習コストが高いとよく言われていますが、 使えるようになるとパッケージマネージャーやライブラリ、コンパイラがとても優秀で便利なため、 多くの恩恵を受けることができます。 今回のサンプルも100行未満で書くことができました。
皆さん、ぜひRustに入門してみませんか?
明日は、sya-riさんの「サーバーサイドについて書きます」です。