sbtでプロジェクト管理をする話
やりたいこと
scalaのプロジェクトを管理したい。
(なんだかよくわからないけど、みんながsbt
を使っているので、自分も使ってみたい。)
やってみたこと
sbtのインストール
macなら、
brew install sbt
まあ、公式マニュアルの通りなんですけどね。
sbtで管理するscalaのディレクトリ構造
sbtで管理する時には、ディレクトリ構造は下記のように設定しなくてはいけない。
build.sbt
ファイルについては後述する。
./ ├── build.sbt // プロジェクトを管理するsbtファイル └── src ├── main // 本番用のコードを置くディレクトリ │ ├── java // java用のコードを置くディレクトリ │ ├── resources // 必要なファイルを置くディレクトリ │ └── scala // scala用のコードを置くディレクトリ └── test // テストのコードを置くディレクトリ ├── java // java用のコードを置くディレクトリ ├── resources // 必要なファイルを置くディレクトリ └── scala // scala用のコードを置くディレクトリ
scalaのコードを書く
とりあえず、なんでもいいので、コードを書く
ここも公式マニュアルに沿う。
object Hi { def main(args: Array[String]) = println("Hi!") }
こいつをhello.scalaとする。
hello.scalaはsrc/main/scala/
かsrc/test/scala/
に置くこと。
Configurationファイルを記述する
プロジェクトのコンパイル方法を指示したレシピを書く(たぶん、そういう解釈で合ってる)
.sbt
ファイルはBuild configurationファイルという名前で呼ばれている。
同じ内容をscalaのコードlikeに書けるFull configurationもあるのだが、後述
よく使う(らしい)コマンドを記述してみる
Build.sbt
の中身に下記を記述する
name := "hello" version := "1.0" scalaVersion := "2.10.0" libraryDependencies += "org.scalatest" %% "scalatest_2.10" % "1.9.1" % "test"
それぞれの意味は下記の通り
name
はプロジェクトの名前version
はプロジェクトのバージョンscalaVersion
はコンパイルに使うscalaのバージョンlibraryDependencies
はプロジェクトが依存しているライブラリ(ライブラリが利用可能な状態でなければ、自動的にダウンロードされてインストールされる。ダウンロードされたライブラリのファイルは~/.ivy2/
以下に保存される)- libraryDependenciesの書式は
libraryDependencies += groupID % artifactID % revision
(ここを見れ)
- libraryDependenciesの書式は
番外編:Full configurationファイルを使う
configurationファイルはscalaのコードlikeにも書ける
このファイルはFull configuration
ファイルと呼ばれて、Build.scala
の名前で、project/の配下に保存する(.sbt
ファイルと置く場所が違うので注意)
プロジェクトのルートディレクトリ直下にproject/
をまだ作っていなかったら、project/
を作成する
project/Build.scala
に下記を記述する
import sbt._ import Keys._ object MyBuild extends Build { lazy val root = Project ( "hello", file("."), settings = Seq( version := "1.0", scalaVersion := "2.10.0" libraryDependencies ++= Seq( "org.scalatest" % "scalatest_2.10" % "1.9.1" % "test") ) }
書いてある内容はBasic configurationと同じなので、説明は省略する
イマイチ.sbt
との違いがわかっていないが、きっと何かしろのメリットがあるんだろう。
コンパイルして実行する
ターミナルで、sbt compile
でコンパイルを実行する
libraryDependenciesに何かを記述している場合はダウンロードしているメッセージが表示されると思う
無事にコンパイルが終了したら、[success] Total time: ** s, completed yyyy/mm/dd hh:mm:ss
というログが出て、コマンドが打てる状態に戻る
エラーメッセージが出ていたら、当たり前だけど、何かを失敗している。エラーメッセージを見て、修正を行なう
コンパイル済みのプログラムを実行するにはsbt run
を実行する
きっと、Hi
とターミナルに表示されるはず
その他
jarファイルを作る
sbtでjarファイルの生成もできる
そのためには、project/assembly.sbt
を作成しておく。中身は
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
と記述する(バージョンが変わった時は適時、変更をー。記述すべき内容は公式ページに書いてあるので)
次にプロジェクトのルート・ディレクトリにもassembly.sbt
を作成する
import AssemblyKeys._ // put this at the top of the file assemblySettings
最後に、build.sbt
にも、assembly用のコマンドを追加する
追記内容は、
import AssemblyKeys._ // 通常のbuild.sbtと同じ内容をここに記述しておくー jarName in assembly := "something.jar" // 生成されるjarファイルの名前
あとは、sbt assembly
のコマンドを実行する。
うまくいったら、target/something.jar
が生成されているはず
sbtのコマンドラインで謎のwarningメッセージが出ていた件
インストール直後のsbtでは、走らせると下記のようなwarningが出力されていた。
Use of ~/.sbtconfig is deprecated, please migrate global settings to /usr/local/etc/sbtopts [warn] The global sbt directory is now versioned and is located at /Users/kensuke-mi/.sbt/0.13. [warn] You are seeing this warning because there is global configuration in /Users/kensuke-mi/.sbt but not in /Users/kensuke-mi/.sbt/0.13. [warn] The global sbt directory may be changed via the sbt.global.base system property.
解決策を探したら、ここにあった。
単に~/.sbt
にある内容をまるごと、~/.sbt/0.13/
に移せばいいだけだった。