プログラミングとか色々

プログラミングとかについて色々

お手軽CLIツール作成

お手軽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さんの「サーバーサイドについて書きます」です。