RUST 実践編 Crate clapのインストール・使い方
そろそろ本腰を入れてRustの勉強を行おうと思いまして,今回はよりRust実践編のシリーズを記事にしていきたいと思います.
CLIアプリケーションの作製
いろいろな文献でRustを用いたCLIアプリケーションの作成例が紹介されています.(公式サイトなどでも紹介有り)
CLIアプリケーションを作るうえで,有名なモジュール「clap」と呼ばれるものが有あるようです.今回はこの「clap」の使い方についてメモを残していきます.
Cargo-editとBetter TOMLのススメ
Rustでは,Cargoというパッケージマネージャーを用いることで,外部モジュールを簡単にインストールすることが可能です.(Cargoの基本的な使い方については別の記事で紹介します.)関係モジュールの管理は,Cargoで作製したプロジェクト内に存在する「Cargo.toml」というファイルで編集を行なうことができます.
このファイル内の「[dependencies]」以下の個所へ
[dependencies]
clap = "3.1.8"
と記入しCargoを用いたビルドを開始することで,必要なパッケージのインストールが自動で行われます.ちなみに今回は「clap」のバージョン3.1.8(記事作成の最新版)をインストールする例を載せています.バージョンの指定は数字の部分を変えることで行うことができます.
ここでCargo-editを紹介します.Cargo-editは,clapのようなパッケージをターミナル上に
cargo add clap
と記入することでインストールすることができます.(pythonのpipみたいなもの)初期状態ではインストールされていないので
cargo install cargo-edit
とターミナル上で入力して,インストールを行いましょう.インストールに失敗する場合は使用しているrustのバージョン(rustcのバージョン)が古くなっている可能が高いです.rustを最新版にアップデートしましょう.
もう一つBetter TOMLをご紹介します.Better TOMLはVScodeのプラグインで,Cargo.tomlbにてファイル内にてパッケージ名やバージョンを検索できます.
Better TOMLの紹介ページ
https://marketplace.visualstudio.com/items?itemName=bungcip.better-toml
トレイトを使う際の注意
ここでやっと本題に突入します.Rustにはモジュールやプログラムを効率よく利用するためにトレイトという機能があります.私自身まだトレイトの理解が足りていないので,勉強し次第トレイトに関して記事を出したいと思います.今回は,トレイトを扱う上で初心者が引っかかりやすい点についてお話したいと思います.
先ほどのCargo.tomlのファイルでclapのExampleプログラムを実行すると
use clap::Parser;
/// Simple program to greet a person
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
struct Args {
/// Name of the person to greet
#[clap(short, long)]
name: String,
/// Number of times to greet
#[clap(short, long, default_value_t = 1)]
count: u8,
}
fn main() {
let args = Args::parse();
for _ in 0..args.count {
println!("Hello {}!", args.name)
}
}
note: `Parser` is imported here, but it is only a trait, without a derive macro
のようなエラーが出力されます.エラーの内容はトレイトはあるけど,宣言マクロがないというものです.要するに,外部モジュール内のトレイト継承(derive)する用の設定ができていませんという内容になるようです.
この問題を解決するにはCargo.tomlの記述を
[dependencies]
clap = {version = "3.1.8", features = ["derive"]}
にする必要があります.(clapの公式ドキュメントより)先ほどのcargo-editを使用した場合,このトレイト継承(derive)を行う為のモジュールインストールを行ってくれないため注意が必要です.
各モジュールの仕様はまだ安定しておらず,ちょっと前の書籍や情報を見てもうまく動作しないことが多いですね.公式ドキュメントやフォーラムを確認して勉強していきたいと思います.