トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

sbt

[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.+")

お名前: コメント: