-
Notifications
You must be signed in to change notification settings - Fork 36
SBT시작하기
daclouds edited this page Feb 1, 2011
·
13 revisions
- SBT는 자바의 ant,maven처럼 빌드 도구입니다. ant나 maven이 xml으로 빌드 설정파일을 구성하는것에 반해 SBT는 스칼라 코드로 프로젝트나 플러그인 설정을 합니다.
- http://code.google.com/p/simple-build-tool/
- sbt-launch-0.7.4.jar 을 다운받아서 다음과 같은 쉘 실행파일을 만듭니다.
java -Xmx512M -Dfile.encoding=utf8 -jar `dirname $0`/sbt-launch.jar "$@"
- 자세한 것은 http://code.google.com/p/simple-build-tool/wiki/Setup 의 Launching 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 .. )
- http://code.google.com/p/simple-build-tool/wiki/BuildConfiguration
- maven의 pom.xml에 해당하는 Project.scala을 만들어 보면,
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을 해야 됩니다.
- 간단하게 IntelliJ 플러그인을 설정해 보겠습니다. https://github.com/mpeltonen/sbt-idea
- project/plugins/Plugins.scala
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.
- 예를 들어, 컴파일때에 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.