@numa08 猫耳帽子の女の子

明日目が覚めたら俺達の業界が夢のような世界になっているとイイナ。

Scalaでコマンドラインツールを作る

id:funnelbitとカラオケハッカソンf:id:numanuma08:20140105234231j:plain

皆様、あけましておめでとうございます。

今年も、よろしくお願いしまScala。

Scalaは便利ですよ

Scalaという言語は非常に便利なので、コマンドラインのツールを実装する場合でももちろん活用できます。

よく利用するのは例えばpicture-showというツールで、これはスライドを作るためのツールです。

また、giter8はsbtなどのビルドツールを利用したプロジェクトのテンプレートを作るツールです。

そもそも、ScalaはJavaのライブラリを利用することができるので利用できるシーンは広そうですね。

そんなわけでScalaでコマンドラインのツールの実装を行おう!と思った際に、どうするべきでしょうか。

  • sbt使ってjarに固める
  • sbtのタスクを作る
  • 適切なツールを使う←せいかい!

まあ、面倒なのでサクッと

conscriptを利用します。実は先ほど紹介したpicture-showやgiter8もconscriptを利用しています。

conscriptの詳細については、conscript - Scala で作られたソフトウェアをインストールするためのツールを参照するのが速いと思います。

conscript-pluginという形式でアプリを実装することで、conscriptを利用してインストールできるツールを実装することができます。

それでは、手順をまとめます。ただし、今回はGithubを利用する前提で記述をしています。conscriptはGithubからプロジェクトを参照するのですが、Github以外のリポジトリも設定可能です。

その辺りの詳細は公式ドキュメントを読むのが正解ですね。

手順

  • 1.giter8を使ってconscript-pluginプロジェクトを作る
  • 2.アプリの実装をする
  • 3.テストをする
  • 4.バイナリをmavenリポジトリに登録する
  • 5.インストールする

1.giter8を使ってconscript-pluginプロジェクトを作る

予めgiter8のインストールを行う必要がありますが、方法についてはReadmeを見るべきだと思います。日本語もありますしね。

Giter8 - Scala アプリケーションの雛形を作るためのコマンドラインツール

giter8がインストールされたら、プロジェクトを作ります。

$g8 n8han/conscript
# アプリ名、組織名(パッケージになる)などを聞かれるので答える
$cd my_app
$sbt

2,3アプリの実装をする,テストをする

src/main/scala/App.scalaApp#runがエントリポイントとなるので、アプリの実装を行います。標準でコンパニオンクラスの名称はAppですが、好きなものに変更することができます。

また、標準ではテストコードはないのでsrc/test/以下にテストコードを起き、適当なテスト用ライブラリを利用してテストを記述することができます。

次にsrc/main/conscript/app/launchconfigを編集します。

エントリポイントのクラス名を変更した場合、[app]classを変更する必要があります。また、launchconfig を格納するディレクトリも、標準ではappとなっていますがこれはコマンドの名称となるので、適切なものに変更する必要があります。

4.バイナリをMavenリポジトリに登録する

バイナリの登録を行う必要があります。オープンソースにするならMaven Centralでいいと思います。

ここの手順が正直一番面倒くさい。とりあえずsbt publish-localでローカルリポジトリにしてしまうのもありかもしれません。

5.インストールする

ようやくconscriptを使ってインストールできます。

$cs [github user name]/[github proejct name]

あとはコマンドを使います。お疲れ様でした。

まとめ、これから

Scalaでコマンドラインを実装する手順をまとめました。Scalaそのものよりも、sbtに関する知識が必要ですね。

広く公開するツールを作成する場合、バイナリをMavenリポジトリへ登録する必要があるわけですが、Maven centralは手順が面倒だなぁと思ってます。

そこで、Github-Pagesを利用する方法が存在するらしいので、そっちを調査しようと思います。

おわり