SBT시작하기 - codeport/scala GitHub Wiki

SBT 시작하기

SBT란?

  • SBT는 자바의 ant,maven처럼 빌드 도구입니다. ant나 maven이 xml으로 빌드 설정파일을 구성하는것에 반해 SBT는 스칼라 코드로 프로젝트나 플러그인 설정을 합니다.
  • http://code.google.com/p/simple-build-tool/

설치하기

 java -Xmx512M -Dfile.encoding=utf8 -jar `dirname $0`/sbt-launch.jar "$@"

SBT 프로젝트 시작하기

  • 특정 디렉토리에서 sbt을 실행하면 sbt는 프로젝트를 생성할것인지 물어봅니다.
sh>sbt
Project does not exist, create new project? (y/N/s) y
Name: testproject
Organization: codeport
Version [1.0]: 0.1
Scala version [2.7.7]: 2.8.1
sbt version [0.7.4]: 
Getting Scala 2.7.7 ...
...
  • 이렇게 생성되는 sbt는 설정에 관련된 파일(build.properties)을 하나만 만듭니다. sbt는 대개 설정에 관련된 파일이 3개정도 있는데요. 나머지 두개는 직접 만들어야 하더군요. (기본적으로 다 많을어주면 편할텐데욤.)
    
    

./project/build.properties ./project/build/Project.scala # 프로젝트 설정 ./project/plugins/Plugins.scala # sbt plugins 설정

  • 디렉토리 구조는 maven의 구조와 흡사합니다. (src/main/scala ... src/test/scala .. )

Project 설정하기

import sbt._

class Project(info:ProjectInfo) extends DefaultProject(info) {

    val casbah = "com.novus" % "casbah_2.8.0" % "1.0.8.5"   
    val bumnetworksRepo = "bumnetworks Repo" at "http://repo.bumnetworks.com/releases/"  

}
  • 딱 보시면 아시겠지만 casbah는 라이브러리 설정이고 bumn..Repo는 레파지토리 설정입니다.
  • sbt는 디렉토리 구조를 보시면 아시겠지만. lib와 lib_managed으로 나누어져있습니다. 즉 lib_managed는 위와 같은 의존성 설정으로 관리되는 패캐지들이 존재하고 lib은 의존성 관리 없이 추가되는 라이브러리 공간입니다. (저는 이 구조가 마음에 들더군요. :-)
  • 이렇게 설정하고 sbt을 실행하면 설정코드가 재컴파일에 들어가게 되어서 update만 하면 되지만, sbt 콘솔로 사용중일때에는 reload 하고 update을 해야 됩니다.

플러그인 설정하기

import sbt._
class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
  val sbtIdeaRepo = "sbt-idea-repo" at "http://mpeltonen.github.com/maven/"
  val sbtIdea = "com.github.mpeltonen" % "sbt-idea-plugin" % "0.2.0"
}
  • project/build/Project.scala
class Project(info:ProjectInfo) extends DefaultProject(info) with IdeaProject {
...
}

bb:hellosbt anarcher$ sbt
[info] Recompiling project definition...
[info]    Source analysis: 1 new/modified, 0 indirectly invalidated, 0 removed.
[info] Building project hellosbt 0.1 against Scala 2.8.1
[info]    using Project with sbt 0.7.4 and Scala 2.7.7
> idea 
[info] 
[info] == idea ==
[info] Created /scm/gits/codeport/scala/hellosbt/.idea
[info] Created /scm/gits/codeport/scala/hellosbt/project/project.iml
[info] Created /scm/gits/codeport/scala/hellosbt/hellosbt.iml
[info] == idea ==
[success] Successful.

간단한 Task 만들어 보기.

  • 예를 들어, 컴파일때에 logs라는 디렉토리를 만들고, clean할때 함께 이 디렉토리도 정리하려면 어떻게 해야 할까요? 간단하게 구현해보면 다음과 같습니다.
class Project(info:ProjectInfo) extends DefaultProject(info) with IdeaProject {

  val casbah = "com.novus" % "casbah_2.8.0" % "1.0.8.5"
  val bumnetworksRepo = "bumnetworks Repo" at "http://repo.bumnetworks.com/releases/"

  val logsPath = "logs"
  lazy val mkdirLogs = task {
    logsPath.asFile.mkdirs()
    None
  } describedAs "mkdir logs/ "
  
  lazy val cleanLogs =  cleanTask(logsPath) describedAs ("clean logs/  ")

  override def compileAction = super.compileAction dependsOn(mkdirLogs)
  override def cleanAction = super.cleanAction dependsOn(cleanLogs)

}

> mkdir-logs 
[info] 
[info] == mkdir-logs ==
[info] == mkdir-logs ==
[success] Successful.
[info] 
[info] Total time: 0 s, completed 2010. 12. 26 #########:37
> compile 
[info] 
[info] == mkdir-logs ==
[info] == mkdir-logs ==
[info] 
[info] == compile ==
[info]   Source analysis: 0 new/modified, 0 indirectly invalidated, 0 removed.
[info] Compiling main sources...
[info] Nothing to compile.
[info]   Post-analysis: 0 classes.
[info] == compile ==
[success] Successful.

> clean-logs 
[info] 
[info] == clean-logs ==
[info] == clean-logs ==
[success] Successful.
> clean
[info] 
[info] == clean-logs ==
[info] Deleting directory /scm/gits/codeport/scala/hellosbt/logs
[info] == clean-logs ==
[info] 
[info] == clean ==
[info] Deleting directory /scm/gits/codeport/scala/hellosbt/target/scala_2.8.1
[info] == clean ==
[success] Successful.
⚠️ **GitHub.com Fallback** ⚠️