[Scala]
sbt
sbtとは
Simple Build Toolの略。ScalaのためのMakefileのようなもの。Mavenと似たIvyという仕組みを使用しているらしい。
各プラットフォームごとのインストール
sbtの公式ドキュメントを読むのがよさそうだ。ネット上の情報は古い場合がある。Installing sbt
build.sbtとbuild.scala
build.sbtはMakefileのごとく静的な構文しか使えない。
name := "My Project" version := "1.0" scalaVersion := "2.10.0"
一方でbuild.scalaはscalaのコードを書けるため、ある程度動的なコードを記述可能となる。
import sbt._ import Keys._ /** * Build クラスを継承して思い通りのMakefileを作る */ object HogeBuild extends Build { val Organization = "jp.gr.java_conf.hangedman" // mavenでいうところの groupId val Name = "Hello" // artifactId となるはずなので、大文字はダメかな? val Version = "0.0.1-SNAPSHOT" // version val ScalaVersion = "2.10.2" // 使用するscalaのバージョン lazy val LibraryDependencies = Seq( /** ここに依存するライブラリを書き込む、 maven とあんまり変わらないですね << groupId >> % << artifactId >> % << version >> "ch.qos.logback" % "logback-classic" % "1.1.+", */ ) /** * 設定の実体、build.sbt ではこれが地の文で書けるはず * * name := "name" * version := "version" * */ lazy val projectSettings = Seq( parallelExecution in Test := false, organization := Organization, name := Name, version := Version, scalaVersion := ScalaVersion, resolvers += Classpaths.typesafeReleases /**, libraryDependencies ++= LibraryDependencies, // <--- ここで依存関係を指定できる port in container.Configuration := 9999, // <--- 開けるポート scalacOptions ++= Seq("-deprecation"), testListeners <<= target.map { t => Seq(new eu.henkelmann.sbt.JUnitXmlTestsListener(t.getAbsolutePath)) } */ ) lazy val project = Project( "Hello", file("."), settings = Defaults.defaultSettings ++ //ScctPlugin.instrumentSettings ++ projectSettings ) /** ここに依存するgitのリポジトリとか書けるぜ dependsOn ( bluh bluh bluh ) */ }
sbtのAPI
以下のページから
LibraryDependencies の構文のしくみ
sbt がbuild.scalaを読み取るときに、Dependencybuilder.scala が動いているらしい
- % 演算子がメソッドとして定義されとる…C++かよ
- このクラスの書き方から、Scalaが独自DSLを書きやすいということがわかる(…だからよくDSLを目にする)
final class GroupID private[sbt] (groupID: String) { def % (artifactID: String) = groupArtifact(artifactID, false) def %% (artifactID: String) = groupArtifact(artifactID, true) private def groupArtifact(artifactID: String, cross: Boolean) = { nonEmpty(artifactID, "Artifact ID") new GroupArtifactID(groupID, artifactID, cross) } }
このスライドが参考になる。
// << groupId >> % << artifactId >> % << version >> // こう書くことは "ch.qos.logback" % "logback-classic" % "1.1.+", // これに等しい sbt.toGroupID("ch.qos.logback").%("logback-classic").%("1.1.+")