🐕

シェルスクリプト風に C# を使えるライブラリ ProcessX 試してみた

2021/10/06に公開
1

のいえさんの blog をチェックしにいったら最新記事が個人的に刺さったので紹介です!

http://neue.cc/2021/08/23_602.html

GitHub リポジトリはこちら。

https://github.com/Cysharp/ProcessX

何が出来るかというと、シェルスクリプトとかでやるような処理を C# で素敵に書けるような奴です。
私は知らなかったのですが、 zx というものを google さんが出していたんですね。

https://github.com/google/zx

こちらは JavaScript でやるみたいなのですが、それの C# 版をのいえさんが作ってました。

試してみよう

手軽に書きたい時は Visual Studio 本体なんて重たいの立ち上げる気にならないということもあると思うので .NET SDK が入ってる環境に VS Code に C# 拡張機能入れたものでやってみたいと思います。

最近の .NET (C#) は CLI も充実していて基本的に CLI で出来ます。なのでコンソールアプリを作りたいときは以下のように叩くと ZxTest というフォルダーにプロジェクトファイルと Program.cs というファイルが出来上がります。

> dotnet new console -o ZxTest

私は 11 月に正式版が出る予定の .NET 6 の RC 版を使ってるので以下のようなファイルが出来上がります。

> ls

    Directory: C:\Labs\ZxTest

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2021/10/06    20:00                obj
-a---          2021/10/06    20:00            105 Program.cs
-a---          2021/10/06    20:00            249 ZxTest.csproj

obj はビルド時に生成されるやつなので基本的には 2 ファイルです。csproj が JS で言うところの package.json のような雰囲気のものだと思って貰えば OK でプログラムのコードは Program.cs になります。

本題の ProcessX とは外れてしまいますが Program.cs もめっちゃシンプルで初期コードのハローワールドはこれだけです。すっきり。

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

では ProcessX 入れていきましょう。以下のコマンドでサクッと入ります。

> dotnet add package ProcessX

下準備が出来たのでのいえさんのページにあるコードを試してみましょう。個人的には git の現在のブランチ名を取るコードを見て感動したのでそれをやってみます。git のリポジトリじゃないとダメなので git init だけはして置いて、その後に以下のコードを書きます。

using Zx;
using static Zx.Env;

var currentBranch = await "git branch --show-current";
log($"現在のブランチは {currentBranch} です!!");

そして、dotnet run を叩くと、そのまま実行されます。(裏でコンパイルはされていますが意識はしなくて大丈夫)

> dotnet run
main
現在のブランチは main です!!

最初の main の出力は git branch --show-current の実行結果で、その結果を変数 currentBranch に受けて log メソッドで加工して標準出力に出しています。C# 自体が結構色々ライトに書けるように進化しているのと、のいえさんが google/zx のアイデアを C# に輸入実装してくれたのも相まってスクリプト言語かよ!って思いたくなるような書き味です。

元々 C# は型がある言語なので、色々がっつりとタイプセーフに書くことも出来ますし、やろうと思えば既存のライブラリも色々インストールして使うことが出来ますね。まぁシェルスクリプトでやろうと思ってるような軽い処理に、そこまでがっつりと書くことがあるかというとあまりないとは思いますが。

CI/CD のパイプラインでお世話になることが多い Linux 系 OS でも .NET SDK さえ入れてしまえば、使えるので個人的には色々捗りそうです。C# 好きな人には是非試してみてもらいたいですね!

まとめ

ということで、文字列を await するのと log メソッドを触っただけですがこれだけでも「まじかよ色々捗りそう」と想像が膨らむと思います。
こういう超ライトな用途にも本当にライトに使えるというのは個人的には大好きなので今後も ProcessX は触っていこうと思います!というか久々にいいね!って心の底から思ったので紹介でした。

Microsoft (有志)

Discussion