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.scalasrc/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ここを見れ

番外編: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/に移せばいいだけだった。

参考記事

インストールから基本的な使いまで