コマンドラインオプションパーサ

とあるゲームに使用する、スクリプトパーサの開発中をC#で行った際、コマンドラインオプションのパースに困ったため調べて見ました。

 

CUIアプリケーションを開発していると、コマンドラインオプションを取り扱うことは必須です。しかし、その処理を毎回書くのは面倒ですからライブラリを使用します。

Pythonにはargparse, rubyにはoptparseというコマンドラインオプションパーサが標準ライブラリに存在します。しかしC#にはありません。

(注: .NET Freamwork4.0でSystem.Shell.CommandLineが追加されるという話がありましたが、結局削除されたようです。現在はCommand Line Parser LibraryとしてCodePlexで公開されています。)

Mono.Options

ということで、C#には標準でコマンドラインオプションパーサがありません。が、Monoにはあります。Mono.Optionsです。NuGetで入れられるので今回はMono.Optionsを採用しました。

基本的な使い方は、

  1. OptionSetに必要なOptionを追加する
  2. argsを使ってOptionSet.Parse(args)する

たったこれだけです。シンプルでいいね。

と言いたいところですが、このライブラリ、使い方がやや特殊なので注意が必要な点が何点かあります。詳細な使い方は以下の通り

1. OptionSetに必要なOptionを追加する

var optionSet = new OptionSet()

.Add("h|help", "Display available options", v => willPrintHelp = v != null)

.Add("o|output=", "Write output to file.", v => output = v);

OptionSet.Addメソッドは、自分自身を返すため、上記のようにメソッドチェーンで複数追加できます。

引数は、左から順に オプション、オプションの説明、指定された時に実行される処理 です。

オプションですが、|で区切ることで、複数の記法をまとめることができます。冗長な名前と短縮した名前の2つを指定する場合が多いでしょう。また、=をつけることで値を与える必要のあるオプションに、:をつけることで値を与えても与えなくてもよいオプションにすることができます。

オプションの説明は、そのままの意味です。Usageを自動生成するときなどに使われます。

最後ですが、オプションが指定されると、指定したAction<string>が実行されます。引数には渡された値が入っています。値が渡されないときは、以下のようにして判定します。

v => hoge != null

2. argsを使ってOptionSet.Parse(args)する

こちらは単純で、以下のようにするだけです。戻り値には、処理されなかった引数が入ります。

var res = option.Prase(args);

 

参考にしたサイト