.NET Core 2.1 の Preview 1 が公開されたそうで

以前から、daily build の不安定な奴で良ければ試せていたんですが、オフィシャルにアナウンスがあったということは、作業が一区切りしたということでしょう。

実際、今回の主題の Global Tools は、以前、daily build で試したときには全然動いていませんでした。 ということで、今日、やっと動いたので試してみたという話。

Global Tools

.NET Core 2.1 の、dotnet コマンドの新機能の1つです。

NPM global toolsにインスパイアされて作ったよ、というもの。

要するに、dotnetコマンドを使って、NuGet 越しにインストール可能なコマンドラインツールを提供するための仕組み。

試しに作ってみたものがこちら:

ツールの作り方

csprojPropertyGroup に、以下のような行を足せばいいらしい。

<PackAsTool>true</PackAsTool>

ただ、現状、Visual Studio の方はまだ対応していなくて、これを入れたプロジェクトをビルドしてもそのままだとパッケージは作られません。dotnet packコマンドを手打ちする必要があります。

dotnet pack -c release cszip/cszip.csproj

詳しくは、公式サンプル: dotnetsayを参照。

ツールのインストールの仕方

dotnet install tool コマンドでインストールできます。

dotnet install tool -g cszip --configfile .\nuget.config

NuGet を使ってパッケージを取ってきて、ユーザー フォルダーの下の .dotnet/toolspkgs.dotnet/tools 以下にもってきて使うようです。 作ったツールはnuget.orgにアップロードするもよし、 ローカル フォルダーを NuGet パッケージ ソースに指定するもよし。

上記の例では、設定ファイルを指定して、ローカルのフォルダーから作ったツールをインストールしています。

ツールの使い方

.dotnet/tools にはパスが通っているので、作ったコマンド ライン アプリがどこからでも呼べるようになっています。 普通にコマンドをたたけば呼べます。

cszip packages sample.zip

試しに作ってみたもの

  • cszip: ZipFile.CreateFromDirectory を呼んでるだけ
  • csunzip: ZipFile.ExtractToDirectory を呼んでるだけ
  • xstatic: .NET 標準ライブラリ中の任意の静的メソッドを呼び出せる

割と最近、社内で C# で書いたコマンド ライン ツールを、 他社の方に使って貰わないといけない事案がありまして。 その時のやり取り:

  • 手元でビルドしたバイナリを毎回手渡しするのしんどいです
  • 先方も、Mac だけど dotnet コマンドは使えるのよね? .NET Core SDK はインストールしてもらえてて。ソースコードは共有してるんだし、向こうで dotnet build してもらったら?
  • 試してみてもらったんですが、PostBuild イベントで呼んでるコマンドが PowerShell なので Mac で呼べませんでした

呼んでるのは Compress-Archive でした。 Cygwin でも入れて zip コマンドに変えれば Mac でも動きそうなものの。 Windows だと bat を書いて、Mac とかだと sh を書いてとかもできはしますが、書くのはいいけど動作確認が大変で。 あと、最近は PowerShell も .NET Core 化してるのでこれを入れてもらうという手もなくはないものの。 そこまでやるか…と悩んだ結果、手渡し運用を続行。

ということで、 dotnet コマンドでインストールできて、dotnet コマンドで実行できるものがあるならそれを使くて、 Global Tools の仕組みを使ってみようかということで作ったのが cszip と csunzip。

で、zip/unzip でコマンド分けるべきか、 分けるの面倒ではないか、 というかむしろいっそのこと任意の静的メソッド呼べるようにしてやろうか。 等々、遊んでみてた結果が xstatic の方です。

インスパイア元の NPM Global Tools も似たような動機ですよね、きっと。 node.js でインストールできて、node.js で実行できるツールが欲しいという。