I'm getting out off the closet on this! I don't understand SBT. There, I said it, now help me please.
All roads lead to Rome, and that is the same for SBT: To get started with SBT
there is SBT
, SBT Launcher
, SBT-extras
, etc, and then there are different ways to include and decide on repositories. Is there a 'best' way?
I'm asking because sometimes I get a little lost. The SBT documentation is very thorough and complete, but I find myself not knowing when to use build.sbt
or project/build.properties
or project/Build.scala
or project/plugins.sbt
.
Then it becomes fun, there is the Scala-IDE
and SBT
- What is the correct way of using them together? What comes first, the chicken or the egg?
Most importantly is probably, how do you find the right repositories and versions to include in your project? Do I just pull out a machette and start hacking my way forward? I quite often find projects that include everything and the kitchen sink, and then I realize - I'm not the only one who gets a little lost.
As a simple example, right now, I'm starting a brand new project. I want to use the latest features of SLICK
and Scala
and this will probably require the latest version of SBT. What is the sane point to get started, and why? In what file should I define it and how should it look? I know I can get this working, but I would really like an expert opinion on where everything should go (why it should go there will be a bonus).
I've been using SBT
for small projects for well over a year now. I used SBT
and then SBT Extras
(as it made some headaches magically disappear), but I'm not sure why I should be using the one or the other. I'm just getting a little frustrated for not understanding how things fit together (SBT
and repositories), and think it will save the next guy coming this way a lot of hardship if this could be explained in human terms.
sbt is an open-source build tool for Scala and Java projects, similar to Apache's Maven and Ant. Its main features are: Native support for compiling Scala code and integrating with many Scala test frameworks. Continuous compilation, testing, and deployment.
Once you familiarize yourself with how one Maven project builds you automatically know how all Maven projects build saving you immense amounts of time when trying to navigate many projects. On the other hand, SBT is detailed as "An open-source build tool for Scala and Java projects".
Create or open your sbt project. In the Project tool window, in the source root directory, locate the build. properties file and open it in the editor. In the editor explicitly specify the version of sbt that you want to use in the project.
Most importantly is probably, how do you find the right repositories and versions to include in your project? Do I just pull out a machette and start hacking my way forward? I quite often find projects that include everything and the kitchen sink
For Scala-based dependencies, I would go with what the authors recommend. For instance: http://code.google.com/p/scalaz/#SBT indicates to use:
libraryDependencies += "org.scalaz" %% "scalaz-core" % "6.0.4"
Or https://github.com/typesafehub/sbteclipse/ has instructions on where to add:
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.1.0-RC1")
For Java-based dependencies, I use http://mvnrepository.com/ to see what's out there, then click on the SBT tab. For instance http://mvnrepository.com/artifact/net.sf.opencsv/opencsv/2.3 indicates to use:
libraryDependencies += "net.sf.opencsv" % "opencsv" % "2.3"
Then pull out the machette and start hacking your way forward. If you are lucky you don't end up using jars that depends on some of the same jars but with incompatible versions. Given the Java ecosystem, you often end up including everything and the kitchen sink and it takes some effort to eliminate dependencies or ensure you are not missing required dependencies.
As a simple example, right now, I'm starting a brand new project. I want to use the latest features of SLICK and Scala and this will probably require the latest version of SBT. What is the sane point to get started, and why?
I think the sane point is to build immunity to sbt gradually.
Make sure you understand:
{<build-uri>}<project-id>/config:key(for task-key)
SettingKey
, TaskKey
, InputKey
) - read the section called "Task Keys" in http://www.scala-sbt.org/release/docs/Getting-Started/Basic-Def Keep those 4 pages open at all times so that you can jump and look up various definitions and examples:
Make maximum use of show
and inspect
and the tab completion to get familiar with actual values of settings, their dependencies, definitions and related settings. I don't believe the relationships you'll discover using inspect
are documented anywhere. If there is a better way I want to know about it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With