.NET Core製のツールをgithubから簡単にインストールできるdotnet-git-toolの紹介

## 初めに

近年**.NET Core**や**Unity**の存在によっていろいろなものが**C#**で書けるようになってきています。
こうなってくるとコマンドラインツールも**C#で書きたくなる**のは自然なことです。

元々コマンドラインツールをC#で書くこと自体は簡単だったのですが問題は配布方法です。
ビルド成果物を直接渡す方式だとそもそも渡すのがめんどくさい、パスを通すのがめんどくさいなどの問題があります。
最近では[.NET core グローバル ツール](https://docs.microsoft.com/ja-jp/dotnet/core/tools/global-tools)というものがあってある程度配布の問題は解消されています。
ただし、.Net Coreグローバルツールの配布にはnugetにアップロードする必要があり手軽さがありません。[^1]


元々ソースをgithubで管理しているので`go get`のように**githubから直接ダウンロード**できたほうが嬉しいです。
そこで `dotnet-git-tool` という`go get`ライクにツールを取得できるツールを作成したのでその紹介です。

[yaegaki/dotnet-git-tool](https://github.com/yaegaki/dotnet-git-tool)

## 事前準備

以下を行っておく必要があります。

* .NET Core 2.2 or .NET Core 3.0のインストール
* gitのインストール
* $HOME/.dotnet/toolsへのパスを通す

## インストール

以下のコマンドで簡単にインストールできます。

```sh
$ dotnet tool install dotnet-git-tool -g
```

## 使い方

github上にホストされた[yaegaki/botsay](https://github.com/yaegaki/botsay)をインストールする場合を例に解説します。
インストールは以下のコマンドで行います。

```sh
$ dotnet git-tool install github.com/yaegaki/botsay

You can invoke the tool using the following command: botsay-z
Tool 'botsay-z' (version '1.0.0') was successfully installed.
```

正常に終了すると`botsay-z`コマンドが使用できるようになっています。
もし使用できない場合は`$HOME/.dotnet/tools`にパスが通っているかどうか確認してください。
(Windowsの場合は`%HOMEDRIVE%%HOMEPATH%\.dotnet\tools`)

```sh
$ botsay-z hello

        hello
    __________________
                      \
                       \
                          ....
                          ....'
                           ....
                        ..........
                    .............'..'..
                 ................'..'.....
               .......'..........'..'..'....
              ........'..........'..'..'.....
             .'....'..'..........'..'.......'.
             .'..................'...   ......
             .  ......'.........         .....
             .    _            __        ......
            ..    #            ##        ......
           ....       .                 .......
           ......  .......          ............
            ................  ......................
            ........................'................
           ......................'..'......    .......
        .........................'..'.....       .......
     ........    ..'.............'..'....      ..........
   ..'..'...      ...............'.......      ..........
  ...'......     ...... ..........  ......         .......
 ...........   .......              ........        ......
.......        '...'.'.              '.'.'.'         ....
.......       .....'..               ..'.....
   ..       ..........               ..'........
          ............               ..............
         .............               '..............
        ...........'..              .'.'............
       ...............              .'.'.............
      .............'..               ..'..'...........
      ...............                 .'..............
       .........                        ..............
        .....
```

リポジトリの中の特定のフォルダにあるプロジェクトを指定してツールをインストールすることもできます。
[yaegaki/botsay](https://github.com/yaegaki/botsay)リポジトリには動作は同じで名前だけ違う`botsay-xyz`というツールが含まれています。
`botsay-xyz`をインストールするには以下のコマンドを実行します。

```sh
$ dotnet git-tool install github.com/yaegaki/botsay/botsay-xyz

You can invoke the tool using the following command: botsay-xyz
Tool 'botsay-xyz' (version '1.0.0') was successfully installed.
```

インストールしたツールのアップデートは`dotnet git-tool install`の代わりに`dotnet git-tool update`を使用することで行うことができます。
インストールしたツールを削除する場合は標準の`dotnet tool uninstall -g`を使用します。

以上が`dotnet-git-tool`の基本的な使用方法です。

## 最後に

作成したばかりのツールなので色々とバグってるかもしれませんが何か見つけたらissueの登録をしていただければと:bow:


## おまけ: MessagePack-CSharpのmpcをインストールする

```sh
# -f オプション: パック可能でないプロジェクトを強制的にパックする
# --any-sdk オプション: リポジトリ内のglobal.jsonに書かれた対象sdkを無視する
$ dotnet git-tool install github.com/neuecc/MessagePack-CSharp/src/MessagePack.UniversalCodeGenerator -f --any-sdk

You can invoke the tool using the following command: mpc
Tool 'mpc' (version '2.0.163-beta') was successfully installed.

$ mpc

mpc arguments help:
  -i, --input=VALUE          [required]Input path of analyze csproj
  -o, --output=VALUE         [required]Output file path
  -c, --conditionalsymbol=VALUE
                             [optional, default=empty]conditional compiler
                               symbol
  -r, --resolvername=VALUE   [optional, default=GeneratedResolver]Set resolver
                               name
  -n, --namespace=VALUE      [optional, default=MessagePack]Set namespace root
                               name
  -m, --usemapmode           [optional, default=false]Force use map mode
                               serialization
```

[^1]: nugetのアップロードはそこまで面倒なわけではありませんが、githubから直接ダウンロードに比べればやはり手間です。また、名前の付け方なども気を付けなければならないため小さなツールを配布するには向いていない印象です。