rksoftware

Visual Studio とか C# とかが好きです

コマンドライン引数を雑に扱う

コンソールアプリ、ちょっとした処理を行う際に雑に作ってしまうのが結構いいのですが、何気にコマンドライン引数の解釈コードが面倒です。
それはもう、あらゆる要素をソースコードに書き込んで毎回ソースコード上の値を書き換えてビルドして使うほどに。

というわけで、引数を扱うコードをメモしておきます。まだいろいろ不完全なので今後いじっていきたいコードです。

■ コード

引数を解釈するコード

public static class ArgumentsBuilder
{
    public static (IReadOnlyList<string> parameters, IReadOnlyDictionary<string, string> options) Parse(string[] args)
    {
        List<string> parameters = new();
        Dictionary<string, string> options = new();
        string optionName = "";

        foreach (var arg in args)
        {
            if (string.IsNullOrWhiteSpace(arg))
            {
                continue;
            }

            {
                var pre = arg.First();
                if (new[] { '-', '/' }.Contains(pre))
                {
                    optionName = new string(arg.SkipWhile(c => c == pre).ToArray());
                    options.Add(optionName, "");
                    continue;
                }
            }

            if (string.IsNullOrWhiteSpace(optionName))
            {
                parameters.Add(arg);
                continue;
            }

            options[optionName] = arg;
            optionName = "";
        }

        return (parameters, options);
    }

}

■ 使う方

<実行ファイル名> aparam -a aopt -b bopt bparam /c copt
var parsed = ArgumentsBuilder.ArgumentsBuilder.Parse(args);

// パラメーターは parameters に入ってくる
parsed.parameters.Skip(0).FirstOrDefault(); // aparam
parsed.parameters.Skip(1).FirstOrDefault(); // bparam

// 今回のコードでは、- または / で始まるものがオプション名、オプションは必ず値を持つという前提で解釈しています
{ parsed.options.TryGetValue("a", out var val); } // aopt
{ parsed.options.TryGetValue("b", out var val); } // bopt
{ parsed.options.TryGetValue("c", out var val); } // copt

雑に作るコンソールアプリ用のコピペ元としてはこんな感じでいいでしょうかね。

雑に使う捨て孫ソールアプリを作るなら値を持たないオプションも積極的に使いたいので、後日コードをアップデートしたいと思います。

dotnet tool の更新確認 dotnet tool を更新しました。

dotnet tool の更新確認 dotnet tool を更新しました。

更新という文字が繰り返しあって混乱しそうですね。

■ 更新内容

実行結果が、見やすくなりました。

  1. 表示がそろうようになって見やすくなりました。
    f:id:rksoftware:20211221012944p:plain
  2. 更新があるツールの文字色が赤くなって見やすくなりました。
    f:id:rksoftware:20211221013317p:plain

悪くないと思っています。ぜひお試しください。

NuGet パッケージのプロパティ (パッケージの情報) を設定する

nuget パッケージには必須のプロパティ情報のほかにも多くの情報が設定できます。
特に Readme やソースコードのリポジトリなどは設定されているとうれしいですね。

設定は .csproj ファイルに書けば OK です。シンプルでわかりやすくていいですね。

■ 実例

どの項目がどんな情報といった定義的な話よりも、実例の .csproj と各場所での情報の見え方を挙げた方がわかりやすいと思います。
というわけで実例です。

次のリポジトリで作っている dotnet tool の例です。

■ ソース

.csproj

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <AssemblyName>Rksoftware.$(MSBuildProjectName)</AssemblyName>
        <DebugType>none</DebugType>

        <PackAsTool>true</PackAsTool>
        <ToolCommandName>DotNetToolUpdateCheck</ToolCommandName>
        <PackageOutputPath>./nupkg</PackageOutputPath>
        <PackageLicenseFile>LICENSE</PackageLicenseFile>
        <PackageId>$(AssemblyName)</PackageId>
        <Authors>Rksoftware</Authors>
        <RootNamespace>Rksoftware.$(MSBuildProjectName.Replace(" ", "_"))</RootNamespace>
        <AssemblyVersion></AssemblyVersion>
        <Version>$(VersionPrefix)0.1.1</Version>
        <DebugType>none</DebugType>

        <Title>dotnet tool update checker</Title>
        <Description>This tool checks for the latest version of installed packages.</Description>
        <Summary>This tool checks for the latest version of installed packages.</Summary>
        <PackageProjectUrl>https://github.com/m-ishizaki/DotNetToolUpdateChecker</PackageProjectUrl>
        <RepositoryUrl>https://github.com/m-ishizaki/DotNetToolUpdateChecker</RepositoryUrl>
        <RepositoryType>git</RepositoryType>
        <PackageReadmeFile>README.md</PackageReadmeFile>
        <Copyright>m-ishizaki</Copyright>
        <PackageReleaseNotes>Added properties for nuget.</PackageReleaseNotes>

    </PropertyGroup>

    <ItemGroup>
        <None Include="..\..\LICENSE" Pack="true" PackagePath="" />
    </ItemGroup>

    <ItemGroup>
        <None Update="README.md">
            <Pack>True</Pack>
            <PackagePath>\</PackagePath>
        </None>
    </ItemGroup>
...(略)...

■ 各所での見え方

README.md

f:id:rksoftware:20211217004259p:plain

nuget の画面

f:id:rksoftware:20211217004041p:plain
f:id:rksoftware:20211217004400p:plain

Visual Studio

f:id:rksoftware:20211217004627p:plain

分かりやすいですね。

dotnet tool の更新確認 dotnet tool 作ってみた

インストール済みの dotnet tool に更新があるかを一括で確認する方法がわからなかったので、dotnet tool を作ってみました。

ちなみに以前には PowerShell で書いてみたりしました。

■ インストール

nuget.org からインストールします。

dotnet tool install --global Rksoftware.DotNetToolUpdateCheckerConsole

■ 使い方

> dotnettoolupdatecheck

■ 実行結果例

Package ID      Current Lasted  Command
redth.net.maui.check    0.10.0  0.10.0  maui-check
rksoftware.dotnettoolupdatecheckerconsole       0.1.0   0.1.0   DotNetToolUpdateCheck
rksoftware.imageresizeconsole   0.2.0   0.2.0   ImageResize

Package ID、現在インストールされているバージョン、最新バージョン、実行コマンド、の順に書かれています。
現在インストールされているバージョンより最新バージョンが大きければ更新があるということになります。

■ ソース

とりあえずまずは試しに動きはするという雑なレベルです。さすがに手を入れたいとは思っています。

関連記事

dotnet tool を更新する方法です。
rksoftware.hatenablog.com

PowerShell でインストール済みのすべての dotnet tool の更新を確認する方法です。
rksoftware.hatenablog.com

インストール済みの dotnet tool に更新があるか確認する

インストール済みの dotnet tool に更新があるかを一括で確認する方法がわからなかったので、PowerShell で書いてみました。
PowerShell 全然わからないので遥かにイイやり方があると思いますが、目的は果たせています。

■ コマンド

> dotnet tool list -g | Select-Object -Skip 2 | ForEach-Object { Write-Host $_; (dotnet tool search (-Split $_)[0])[2]; }

■ 実行結果例

redth.net.maui.check               0.10.0      maui-check
redth.net.maui.check      0.10.0       Redth      81725
rksoftware.imageresizeconsole      0.2.0       ImageResize
rksoftware.imageresizeconsole      0.2.0        Rksoftware      16

ツールひとつずつに対して、dotnet tool list -g の結果 (現在インストールされているバージョン) と dotnet tool search の結果 (最新バージョン) が 2 行の組で出力されます。
バージョン番号の異なっている組があればそのツールは更新があるはずです。

関連記事

dotnet tool を更新する方法です。
rksoftware.hatenablog.com

インストール済みの dotnet tool の更新を確認する dotnet tool です。
rksoftware.hatenablog.com

衝撃の事実! 焼き肉の一番おいしい食べ方が判明

皆さん焼き肉はすきですか?

好きな方も好きでない方もいると思います。けれども世間でごちそうとされている事は、皆さんそこそこ異論はないかと思います。
そんな焼き肉ですが、意外と難しい食事です。たれや調味料の種類や配分、焼き加減など食べ方が無限にあるのです。まさに宇宙! 焼き肉 is スペース!

当然おいしい食べ方にも議論が尽きません。しかし今回なんとそんな焼き肉の一番おいしい食べ方が判明しました。

他人の🍆で食べる焼き肉が一番おいしいということです!

いかがでしたか?

dotnet tool 作ってみた (2)

以前に dotnet tool を作ってみました。
rksoftware.hatenablog.com

■ 能力・使い方 (これまで)

1つ目の引数で画像のパスを渡すと、リサイズした新しい画像を2つ目の引数のパスに作成します。リサイズは長辺が 1368 になるように拡大/縮小されます。それだけですをサイズの指定もできません。

> ImageResize C:\1\DSC00001.JPG C:\2\1.jpg

■ 新機能

  • 引数にディレクトリのパスを渡せるようになりました。ディレクトリ内のすべてのファイルに対して処理を行います。その際、出力先のディレクトリには三桁数値の連番 ( 001 始まり) でファイル名を付けます。
  • 第三引数にサイズを指定できるようになりました。省略した場合は、1368 です。

便利ですね。