CLOVER🍀

That was when it all began.

sbt(Simple Build Tool)0.10ことはじめ

以前から使ってはいたのですが、CentOSからUbuntuに移行した時に残念ながらsbtの設定は吹っ飛んでしまったため、いい機会なのでまとめておこうと思います。

sbt(Simple Build Tool)
https://github.com/harrah/xsbt/wiki

sbtは、Scalaのための開発ツールです。Javaの世界でいくとMavenに近いと思われるのですが、MavenのようにXMLしていないので、導入はもうちょっと簡単かも。

sbtは0.7系と0.10系があり、世の中の情報は0.7系を中心に書かれていますが、今回はせっかくなので0.10系にトライしてみましょう。

では、手順を見ながらセットアップ!
https://github.com/harrah/xsbt/wiki/Setup

上記ページから、「sbt-launch.jar」をダウンロードしてきて、適当なディレクトリに配置します。配置したら、同じディレクトリに「sbt」という名前のスクリプトを作成します。内容は、以下です。

$ cat sbt
java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"

※なお、sbt-launch.jarとsbtスクリプトは、プロジェクトディレクトリ内に配置するのが本来正しいっぽいですね

Mavenと同じようにインターネット越しにファイルをダウンロードしようとしてくるので、ネットワークにつながっている必要があります。プロキシ越しにアクセスしなければならない場合は、以下のようにシステムプロパティを利用するらしいです。

java -Dhttp.proxyHost=myproxy -Dhttp.proxyPort=8080 -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"

実行権限も付与しておきましょう。当方、sbtは/usr/localに配置しているため、sudoが付いています。

$ sudo chmod a+x sbt

あとは、できたスクリプトにPATHを通しておきましょうね。

export SBT_HOME=/usr/local/sbt
PATH=${SBT_HOME}:${PATH}

では、さっそく使ってみます。作業対象のディレクトリを作成、移動した上で、「sbt」とタイプ。

$ mkdir hello
$ cd hello/
$ sbt
Getting net.java.dev.jna jna 3.2.3 ...
downloading http://repo1.maven.org/maven2/net/java/dev/jna/jna/3.2.3/jna-3.2.3.jar ...
	[SUCCESSFUL ] net.java.dev.jna#jna;3.2.3!jna.jar (3807ms)
:: retrieving :: org.scala-tools.sbt#boot-app
	confs: [default]
	1 artifacts copied, 0 already retrieved (838kB/28ms)
Getting Scala 2.8.1 (for sbt)...
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.8.1/scala-compiler-2.8.1.jar ...
	[SUCCESSFUL ] org.scala-lang#scala-compiler;2.8.1!scala-compiler.jar (8049ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-library/2.8.1/scala-library-2.8.1.jar ...
	[SUCCESSFUL ] org.scala-lang#scala-library;2.8.1!scala-library.jar (5290ms)
downloading http://repo1.maven.org/maven2/jline/jline/0.9.91/jline-0.9.91.jar ...
	[SUCCESSFUL ] jline#jline;0.9.91!jline.jar (958ms)
downloading file:/xxxxx/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar ...
	[SUCCESSFUL ] junit#junit;3.8.1!junit.jar (18ms)
:: retrieving :: org.scala-tools.sbt#boot-scala
	confs: [default]
	4 artifacts copied, 0 already retrieved (15296kB/149ms)
Getting org.scala-tools.sbt sbt_2.8.1 0.10.0 ...
 …省略…
[info] Set current project to default (in build file:/xxxxx/hello/)
> 

初回は、Mavenがごとく鬼のようにダウンロードが行われるので、しばらく待ちましょう。

Set current project to default
>

これが出てきたら、一旦終了。

> exit

sbt 0.10からは、build.sbtがけっこう変わったのね…。サンプルを見ながら、build.sbtを作成します。

$ emacs build.sbt &
$ cat build.sbt 
name := "Hello"

version := "1.0"

scalaVersion := "2.9.0"

各項目の間に空行がありますが、これがないとエラーになるようなので要注意です。あと、Scalaのバージョンに2.9.0-1を指定すると、リポジトリに無いと言われエラーになります。とりあえず今回は2.9.0を指定しました。大丈夫か?

再びsbtを実行。

$ sbt
Getting Scala 2.9.0 ...
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.9.0/scala-compiler-2.9.0.jar ...
	[SUCCESSFUL ] org.scala-lang#scala-compiler;2.9.0!scala-compiler.jar (11981ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-library/2.9.0/scala-library-2.9.0.jar ...
	[SUCCESSFUL ] org.scala-lang#scala-library;2.9.0!scala-library.jar (10270ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/jline/2.9.0/jline-2.9.0.jar ...
	[SUCCESSFUL ] org.scala-lang#jline;2.9.0!jline.jar (953ms)
downloading http://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.4/jansi-1.4.jar ...
	[SUCCESSFUL ] org.fusesource.jansi#jansi;1.4!jansi.jar (992ms)
:: retrieving :: org.scala-tools.sbt#boot-scala
	confs: [default]
	4 artifacts copied, 0 already retrieved (20442kB/177ms)
[info] Set current project to default (in build file:/xxxxx/hello/)

Scala 2.9.0をダウンロードしてきた模様です。

で?ここまでやって、helloディレクトリの配下は以下のようになっています。

hello$ ll
合計 20
drwxr-xr-x 4 xxxxx xxxxx 4096 2011-07-10 18:55 ./
drwxr-xr-x 3 xxxxx xxxxx 4096 2011-07-10 18:36 ../
-rw-r--r-- 1 xxxxx xxxxx   58 2011-07-10 18:54 build.sbt
drwxr-xr-x 4 xxxxx xxxxx 4096 2011-07-10 18:37 project/
drwxr-xr-x 5 xxxxx xxxxx 4096 2011-07-10 18:51 target/

…srcとかはどこに行った?う〜ん、何か手順が悪かったのかなぁ??

とりあえず、手で作ってみますか。

$ mkdir -p src/main/scala
$ cat src/main/scala/HelloSbt.scala 
object HelloSbt {
  def main(args: Array[String]): Unit = {
    println("Hello World")
  }
}

では、試してみます。

$ sbt
[info] Set current project to default (in build file:/xxxxx/hello/)
> compile
[info] Updating...
[info] Done updating.
[info] Compiling 1 Scala source to /xxxxx/hello/target/scala-2.9.0.final/classes...
[success] Total time: 8 s, completed Jul 10, 2011 6:57:33 PM
> run
[info] Running HelloSbt 
Hello World
[success] Total time: 0 s, completed Jul 10, 2011 6:57:35 PM

動きおった…。これでいいのかなぁ?何かが間違っている気がするんですが。

なお、Mavenではダウンロードしてきたファイルとかは.m2ディレクトリに置かれて
いましたが、sbtはIvyを利用しているらしく、ホームディレクトリの配下に.ivy2が
できています。ご注意を。