以前PicocliとGraalVMを使ってScalaでネイティブCLIアプリケーションを作成する方法を試してみたのですが、その後細々とスタンドアロンのネイティブイメージを作成するのに適したScalaライブラリの組み合わせを試したりしていたので、これらをまとめてgiter8テンプレートにしてみました。
使い方は簡単で、まずは以下のようにしてプロジェクトを作成します。
$ sbt new takezoe/scala-native-cli.g8
scoptを使った簡単なサンプルコードも生成されるようになっているのでこれをベースにコマンドを実装したら、以下のコマンドを実行するとtarget/graalvm-native-image
ディレクトリにネイティブイメージが生成されます(GraalVMとnative-imageコマンドは予めインストールしておく必要があります)。
$ sbt graalvm-native-image:packageBin
テンプレートといってもscala-native-packagerと、CLIツールを作るのに便利そうないくつかのライブラリを設定済みのsbtプロジェクトを生成するだけですが、他にもIOやファイル操作関連のライブラリを入れておくと便利そうな気がします。テンプレートにいろいろライブラリを入れておいて、必要なもの以外はコメントアウトして使うというような使い方が良いかもしれません。このあたりは自分でも使いながらブラッシュアップしていこうかと思います。
実は同様のgiter8テンプレートも既に存在するのですが、自分のユースケースにあわせてデフォルトのライブラリをカスタマイズできた方が便利そうということで…。
ただ、こちらのテンプレートはDockerイメージの作成にも対応しているようです。もちろんツールの利用者はDockerさえインストールされていれば使えますし、ビルドもDockerで行うためビルド時にローカルにGraalVMをインストールする必要もないようです。これは中々便利そうな機能なので時間があれば自分のテンプレートにも取り入れてみようかと思います。