C#のコマンドライン引数をパースするライブラリ「System.CommandLine」を試す。

C# コンピュータ
C#

CLIのアプリケーションを作成していて実行時のパラメータをコマンドライン引数として渡す必要が出てきました。
コマンドライン引数は、アプリケーションのエントリーポイントであるMainメソッドの引数として文字列の配列として渡されます。
ファイルのパスを1つ渡すぐらいであれば文字列の配列でも良いですが、入力ファイルや出力ファイル、各種オプションなどを扱いたい場合、区切り文字、必要なパラメーター不足などのエラーチェックなどなど、色々とケアするべき内容が多くなります。

それらをいい感じに処理してくれるライブラリ「System.CommandLine」を見つけましたので試してみたいと思います。

サンプルプログラムの内容はzipファイルにコメントをセットするcliのコマンドのプログラムになります。

プロジェクトの作成

mkdir AddCommentToZip
cd AddCommentToZip
dotnet new console
dotnet add package System.CommandLine --prerelease

(prereleaseオプションをつけないと通りませんでした。)

ソースコード

using System.CommandLine;
using System.IO.Compression;

namespace AddCommentToZip;
class Program
{
    static void AddCommentToZipFile(FileInfo file, string comment)
    {
        if (!File.Exists(file.FullName)) return;
        if (!file.Extension.Equals(".ZIP", StringComparison.CurrentCultureIgnoreCase)) return;

        using var fs = new FileStream(
            file.FullName,
            FileMode.Open,
            FileAccess.ReadWrite);
        using var zip = new ZipArchive(fs, ZipArchiveMode.Update);
        zip.Comment = comment;
    }
    static async Task<int> Main(string[] args)
    {
        var fileOption = new Option<FileInfo?>(
            name: "--file",
            description: "コメントを追加するZIPファイル"
        ){ IsRequired = true };
        var commentOption = new Option<string>(
            name: "--comment",
            description: "追加するコメント"
        ){ IsRequired = true };
        var rootCommand = new RootCommand(
            "ZIPファイルにコメントを追加するコマンド"
        );
        rootCommand.AddOption(fileOption);
        rootCommand.AddOption(commentOption);

        rootCommand.SetHandler((file, comment) => 
            {
                AddCommentToZipFile(file!, comment);
            },
            fileOption, commentOption);

        return await rootCommand.InvokeAsync(args);
    }
}
ソースコードのダウンロード

実行

コマンドライン引数をセットして実行

 dotnet run -- --file test.zip --comment ABCDEFG

dotnet runでコマンドライン引数を試す場合–を付加するようです。

ヘルプ

 dotnet run -- --help
Description:
  ZIPファイルにコメントを追加するコマンド

Usage:
  AddCommentToZip [options]

Options:
  --file (REQUIRED)        コメントを追加するZIPファイル
  --comment (REQUIRED)  追加するコメント
  --version            Show version information
  -?, -h, --help       Show help and usage information

ヘルプにも対応しているようです。

引数なしで実行

dotnet run --
Option '--file' is required.
Option '--comment' is required.

Description:
  ZIPファイルにコメントを追加するコマンド

Usage:
  AddCommentToZip [options]

Options:
  --file <file> (REQUIRED)        コメントを追加するZIPファイル
  --comment <comment> (REQUIRED)  追加するコメント
  --version                       Show version information
  -?, -h, --help                  Show help and usage information

感想

チュートリアルの内容を元に自分なりにコードを書いてみました。
Tutorial: Get started with System.CommandLine - .NET
Learn how to use the System.CommandLine library for command-line apps.

引数を省略した場合や、コマンドの戻り値の設定など知らないことも多いので少しづつ学んでいきたいと思います。
System.CommandLine でコマンドを定義する方法 - .NET
System.Commandline ライブラリを使ってコマンド、オプション、引数を定義する方法について説明します。

コメント