2012年9月12日水曜日

goldenport-runner 0.1.0

Scalaプログラムの開発時に、開発中のプログラムを普通の環境で使いたいことがよくあります。そのたびにパッケージングして配備するのも大変ですし、javaコマンドで直接起動する場合には依存するJARファイル群にクラスパスを通す設定が困難を極めます。

この問題を解決するために作成したのがgoldenport-runnerです。

goldenport-runnerはensimeのコンフィグレーションファイル(.ensime)から、プログラムの実行に必要な情報を収集し起動するアプリケーション・ランチャーです。(.ensimeの情報を読み込むためにgoldenport-sexprを使用しています。)

インストール

以下のjarファイルをダウンロードしてlibディレクトリなどにコピーします。

使用方法

以下のようにプロジェクトのディレクトリとアプリケーションのメインとなるクラス名を指定し、続けてアプリケーションの引数を渡します。

$ java -jar goldenport-runner_2.9.2-0.1.0-one-jar.jar プロジェクトディレクトリ クラス名 引数

以下のようなスクリプトを作ってbinディレクトリに入れておくと便利です。

#! /bin/sh

JAVA_OPTS="-Xmx512m -XX:MaxPermSize=256m -Dfile.encoding=UTF-8"

java $JAVA_OPTS -jar $HOME/lib/goldenport-runner_2.9.2-0.1.0-one-jar.jar $HOME/src/mycommand com.example.mycommand.Main "$@"

使用例

sbtプロジェクトにensimeプラグインを追加したプロジェクトを用意します。

手っ取り早く試すには、昨日紹介したscala-sbt.g8を使うとよいでしょう。

$ g8 asami/scala-sbt

asami/scala-sbtのsbtプロジェクトではensimeプラグインが予め設定されています。

g8コマンドでプロジェクトを生成します。デフォルトの値で生成するとディレクトリcommandの下にプロジェクトが生成されます。(commandの部分はプロジェクト名によって変わります。)

$ cd command
$ ls
README  build.sbt project  src

プロジェクトをビルドします。

$ sbt test
...
[info] CommandSpec:
[info] Command 
[info]   should execute that 
[info]   - empty arguments
[info]   - one argument
[info] Passed: : Total 2, Failed 0, Errors 0, Passed 2, Skipped 0
[success] Total time: 4 s, completed ...

ensimeのコンフィグレーションファイル(.ensime)を生成します。

$ sbt "ensime generate"

goldenport-runnerで実行します。

$ java -jar ~/Downloads/goldenport-runner_2.9.2-0.1.0-one-jar.jar . com.example.command.Main ls
project
README
target
build.sbt
src

用途

goldenport-runnerは、元々プログラム開発時のツールとして作ってみたのですが、Scalaスクリプト的な使い方が便利ではないかと思いつきました。

Scalaはスクリプト機能を持っていますが、依存jarが一つでもあると簡単に実行することはできないため、事実上スクリプト的な使い方をすることが困難でした。scalazScala IOが使えないと不便でしかたありません。

goldenport-runnerを用いることで、sbtプロジェクトで普通に開発したScalaプログラムをスクリプト的に手軽に使えるようになります。scala-sbt.g8もこの用途を意識した構成になっています。

ちょっとした運用ツールなどスクリプト的な用途のプログラムでも、ちょっと複雑になるとテストプログラムも必要になります。また、TDDやBDD的な作り方ができると便利です。そういう意味でsbtプロジェクトとして作ってgoldenport-runnerで運用するのは、なかなか便利そうです。

ScalaスクリプトにはsbtベースのScriptsというアプローチもあるので、適材適所で使い分けするのもよいかもしれません。

0 件のコメント:

コメントを投稿