the industrial

都内で働くITエンジニアの日記

Simple Build Toolのお勉強

コンニチハ。

最近、というか今年は特にScalaの勉強に精を出したい訳でして、何となく使っていたScalaの基礎の基礎から読み直しをしています。
それこそ、人に聴かれて答えられる知識を有するくらいにはならないと、勉強している意味もないですからね。

んで、Scalaソースコード作っていちいちScalacして(Scalaコンパイルは重たい)、コンパイルエラーあるいは挙動を確認するのがめっちゃめんどくさかったので、これはいかんと思い、まずはSimple Build Tool(イカ、sbt)の勉強をする事に。

と言いますか、Scalaやるならsbt分かっていないと話にならないらしい。
簡単な入門程度でも書いておけば、忘れないかなってね。


1.sbtのインスコ

僕はHomebrew使っちゃいました。日本語で自家醸造だかなんだからしくて、お酒好きな僕には響きがいいのでHomewbrewをよく使います。便利。
brew install sbt



2.フォルダ作成

sbtには決まったディレクトリ構造があり、それに習ってScala用にディレクトリを作成。
mkdir -p MyProject/src/main/scala


ディレクトリも移動しとく
cd MyProject



3.Configurationファイルを作成

これ重要。sbtがこのファイルに習ってビルド実行してくれる。
Configurationファイルの作成方法は「Basic Configuration」と「Full Configuration」という2種類の方法がある。

Basic Configuration」と「Full Configuration」の使い分けは、もちろん俺はそこまで使いこなせてないんだけど、こう言う事らしい。

Basic Configuration」
簡単だけど、基本的な事しか出来ない。

「Full Configuration」
その名の通り、フルで設定出来る。
いろんな機能を使うときにこっちじゃないとダメだとか。
Basic Configuration」も使える。

だから、基本的に「Full Configuration」使ってれば良いんじゃないのかな。

なので、今回は「Full Configuration」の方でやってみる。なぜなら、さっき「Basic Configuration」の方でやったからw今回は「Basic Configuration」でやる。
というのも、「Full Configuration」だと何故か原因不明のエラーが出てしまいコンパイル出来ず(※)。それは後で調べよう。

Configurationファイルは、プロジェクトのルートディレクリに配置する。
そういや、知らないで使っていたPlayframworkのConfigurationファイルもそうだったね。
ここで繋がったんだけど、知らないって恥ずかしいw
Configurationファイルは、「Basic Configuration」の場合プロジェクトのルートディレクリに、「Full Configuration」の場合「project/」配下に配置する。


Configurationファイル名は、「Basic Configuration」だと「*.sbt」、「Full Configuration」だと「*.scala」で記述。
つまり、「Full Configuration」はScalaで記述する事になるってこと。
「build.sbt」「Build.scala」 で作成する事が一般的。

ってことで、「Full Configuration」はこんな感じにScala Objectを作成。
おいっきりScalaっすね。
vim Build.scala



1:プロジェクト名を記述
2:プロジェクトのルートディレクトリを記述
 (つまりここをいじれば何処にConfigurationファイルをおける?
3:プロジェクト設定を記述
4:プロジェクトのバージョン
5:Scalaのバージョン
 この後ソースを作ってsbtでコンパイルするんだけど、その時にConfigurationファイルに記載のScalaのバージョンを使用する用になる。

(※)の通り、意味不明なエラーが解決出来ていないので、「Basic Configuration」の場合(build.sbt)のConfigurationファイルの作り方。こんな感じらしい。
vim build.sbt



どっちも同じ挙動なのに、「Basic Configuration」は簡素。それだけに、複雑な設定は出来ないってことですかなあ。


4.HelloWorldを作成

これは簡単。
ただし、「src/main/scala」に作成すること。
Javaだったら「src/main/java」に作成する。
vim src/main/scala/HelloWorld.scala



ついでに、まだ試していないJavaのハロワ作っておくかい。
mkdir src/main/java
vim src/main/java/HelloWorld.java


Javavimで書くのってなんか気持ち悪いw
今のところこんな感じのディレクトリ構造です。



5.コンパイル

ソースが出来たら、いざコンパイル
コマンドは、そのまんまの「sbt compile」。
sbt compile
[success] Total time: 46 s, completed 2014/01/05 21:54:57
こんな感じに出ればOK。 ちなみに、コンパイル後のディレクトリ構造はというと、ちょっと見づらいけどこんな感じ。
.
├── project
│ └── target
│ └── config-classes
│ ├── $16780968a37baefb5487$$anonfun$$sbtdef$1.class
│ ├なんかいろいろ
├── src
│ └── main
│ ├── java
│ │ └── HelloWorld.java
│ └── scala
│ └── HelloWorld.scala
└── target
├── resolution-cache
│ ├── default
│ │ └── myproject_2.10
│ │ └── 0.1-SNAPSHOT
│ │ ├── resolved.xml.properties
│ │ └── resolved.xml.xml
│ ├── myproject
│ │ └── myproject_2.9.2
│ │ └── 1.0
│ │ ├── resolved.xml.properties
│ │ └── resolved.xml.xml
│ └── reports
│ ├── なんかいろいろ
├── scala-2.10
│ └── classes
├── scala-2.9.2
│ └── classes
│ ├── HelloWorld.class
│ ├── HelloWorldScala$.class
│ ├── HelloWorldScala$delayedInit$body.class
│ └── HelloWorldScala.class
└── streams
├なんかいろいろ

6.実行

では実行する。
sbt run

すると、sbtはプロジェクト内の事項可能なリソースを探しに行く。 
今回の場合、scala版とJava版のHelloWorldを作成しているので、実行可能なリソースは2つ。 

「sbt run」の結果はこんな感じ。


Scalaで作ったHelloWorldを実行するため、「2」を入力。


ちゃんと「HelloWorld by sbt on Scala」と表示されました! ちなみに、Javaの方も...


ちゃんと「HelloWorld by sbt on Java」と表示されました! 取りあえずこれで終了〜。


※エラーについて

「Full Configuration」のConfigurationファイル自体は恐らく問題ないと思っているんだけど、コンパイル時に何故か下記の様なエラーが。

[info] Set current project to myproject (in build file:/Users/user/sbt/MyProject/) 
[info] Compiling 2 Scala sources and 1 Java source to /Users/user/sbt/MyProject/target/scala-2.10/classes...
[error] /Users/user/sbt/MyProject/Build.scala:1: not found: object sbt 1 name := "MyProject"
[error] import sbt._ [error] ^
[error] /Users/user/sbt/MyProject/Build.scala:2: not found: object Keys
[error] import Keys._ [error] ^
[error] /Users/user/sbt/MyProject/Build.scala:4: not found: type Build
[error] object MySbtBuild extends Build { // object???͉??ł?ǂ?
[error] ^
[error] /Users/user/sbt/MyProject/Build.scala:6: not found: value Project
[error] lazy val root = Project(
[error] ^
[error] four errors found
[error] (compile:compile) Compilation failed
[error] Total time: 3 s, completed 2014/01/05 21:44:29

う、うーむ。 いろいろ調べてみたんだけど、後ほどまたチャレンジ...。

 〜〜〜

 ちなみに、この本を使って勉強していまする〜。 
わかりやすい。でも、ちまたで話題のコップ本も読んでみたいですな。


〜〜〜


※について追記

コメントにてご指摘頂き、下記のように修正して解決! なんて事はない、「Full Configuration」でやる時のConfigurationファイル(Build.scala)の配置場所が間違っていただけでした。 こんな風に、「Build.scala」を「project/」に配置。


ついでに「Build.scala」の中身も修正。


これでOK。 ありがとうございました。


※2ちなみに

Basic Configuration」で定義した内容は、「Full Configuration」を使う場合でも有効らしい。 ということで、下記の様に配置してコンパイル(中身は同じ)。


無事、成功。

  [success] Total time: 10 s, completed 2014/01/05 23:52:51 



Basic Configuration」と「Full Configuration」の両方を使う場合、双方の間で矛盾が無いことをしっかり確認しておく必要はありそう(当たり前か)。

 プロジェクトによってはもしかしたら「Basic Configuration」と「Full Configuration」の両方を使う事もあるんだろうけど、まあ、実際仕事でsbtを使った開発はした事ないので、当分「Full Configuration」だけで行こうかとね。