In diesem kleinen Tutorial möchte ich kurz umreißen, was man tun muss, um ein Scala-Projekt mit mehrere Modulen und IntelliJ-Unterstützung zu erstellen.
Zuerst werden wir uns mit der Einrichtung des Git-Repositories beschäftigen - es ist einfach praktisch. Danach folgt eine Schnelleinführung in sbt und die Konfiguration der Projekte. Als kröndenden Abschluss erstellen wir die passenden IntelliJ IDEA Projektdateien, so dass wir in einer schönen Entwicklungsumgebung unsere Projekt-Ideen realisieren können.
Git
Zuerst einmal legen wir ein neues Git-Repository an:
mkdir sampleproject && cd sampleproject git init git remote add origin [your github repository url] touch README git add README
Jetzt braucht es noch eine passende .gitignore-Datei:
.target/ .idea .idea_modules
Das ganze dann noch zu git hinzufügen und alles committen:
git add .gitignore git commit -m "initial commit" git push origin master
SBT
Eine Installationsanleitung für das Simple Build Tool(SBT) findet man auf https://github.com/harrah/xsbt/wiki/Getting-Started-Setup.
Nun müssen wir sbt sagen, wie das Projekt in dem Ordner heißt, was es für (globale) Abhängigkeiten hat, etc. Dazu erstellen wir in unserem sampleproject-Ordner eine Datei build.sbt:
name := "sampleproject" organization := "com.example" version := "0.1" scalaVersion := "2.9.1" libraryDependencies += "org.scalatest" %% "scalatest" % "1.7.2" % "test" resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
Wichtig hierbei sind die Leerzeilen zwischen den einzelnen Einträgen. Die meisten davon sprechen für sich selbst. Die libraryDependencies-Zeile ist ähnlich wie in Maven aufgebaut:
libraryDependencies += "[group id]" %% "[artifact id]" % "[version]" % "[scope]"
In dem Beispiel oben definieren wir eine Abhängigkeit auf ein bekanntes Testframework für Scala, das wesentlich mächtiger als JUnit ist.
Zudem kann man über die Resovers weitere Repositories angeben, wobei das Standard Maven 2 Repository und
Wir möchten nun zwei Projekte anlegen, ein Bibliothek-Projekt namens "sample-library" und ein Project "demo-application", dass die Funktionalität demonstriert.
Dazu legen wir in sampleproject einen Ordner "project" an:
mkdir project
Nun zur eigentlichen Build-Definition. Diese ist eine Scala-Datei namens Build.scala, welche eine Klasse enthält, die von Build erbt.
import sbt._
import Keys._
object ProjectBuild extends Build {
lazy val root = Project(id = "sampleproject",
base = file(".")) aggregate(library, demoproject)
lazy val library = Project(id = "library",
base = file("library"))
lazy val demoproject = Project(id = "demo-project",
base = file("demo-project")) dependsOn(library)
}
Wir können auch für die einzelnen Projekte noch Abhängigkeiten und Konfigurationen festlegen. Dazu hat Twitter ein nettes Tutorial gemacht.
SBT verwendet für Quelldateien die gleichen Pfade wie Maven. Die passenden Ordner wollen wir nun erstellen:
mkdir -p library/src/main/scala library/src/test/scala mkdir -p demo-project/src/main/scala demo-project/src/test/scala
IntelliJ Idea
Für SBT gibt es ein Plugin, welches die passenden Projektdateien für IntelliJ generiert. Dazu fügen wir in im projects-Ordner, in der auch unsere Build.scala liegt, eine Datei plugins.sbt ein:
resolvers += "sbt-idea-repo" at "http://mpeltonen.github.com/maven/"
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.0.0")
Nun updaten wir die Projektkonfiguration und generieren die Projektdateien:
sbt update sbt gen-idea
Jetzt kann man das Projekt schön in IntelliJ via File→Open Project öffnen. Nun noch aus IntelliJ das "Changes View" aufrufen und die Projekt-Konfigurationen und Ordner committen - fertig.
Also: Happy coding!