sbtサーバとRustで書かれたsbtクライアント

Scalaのビルドツールsbtには1.xからLanguage Server Protocol 3.0に対応したサーバモードが実装されており、常駐させたサーバに別プロセスから接続してコマンドを実行することができます。サーバモードはIDEやエディタプラグインのために実装されたものだと思いますが、sbtにはクライアントモードも実装されており、コマンドラインで動作を確認することもできます。

たとえばあるプロジェクトでsbtのプロセスを立ち上げておき、

$ sbt
...
sbt:gitbucket>

別のターミナルから以下のようにしてコマンドを送信します。

$ sbt client clean
...
[info] entering *experimental* thin client - BEEP WHIRR
> compile

サーバ側ではこんな感じのログが表示されます。

[info] new client connected: network-1
[success] Total time: 0 s, completed Oct 21, 2018 9:16:38 PM
[success] Total time: 0 s, completed Oct 21, 2018 9:16:38 PM

sbt clientコマンドはサーバが立ち上がっていない場合は自動的に起動するので直接実行してもよいのですが、コマンドの出力が見えないので別ターミナルでsbtのプロセスを立ち上げておいた方が動きがわかりやすいです。ただ、ログにも出ている通りこのsbt clientコマンドは実験的なもののようで、何故かわかりませんがコンパイルを実行すると帰ってこなくなったりします。

スタンドアロンで利用できるsbtクライアントとしてRustで書かれた以下のものがあります。Macならバイナリが用意されているのでダウンロードしてPATHの通っている場所に置くだけで使えます。

github.com

こちらもsbtサーバが立ち上がっていない場合は自動的に起動するのですが、sbt clientコマンドが止まってしまうようなケースでもちゃんと動作しますし、起動にJVMのオーバーヘッドがないという意味で実用的なクライアントと言えるかもしれません。