What do the % and %% operators do when setting up SBT dependencies?
Asked Answered
C

3

18

In Lift Web Framework, dependencies for Simple Build Tool (SBT) are specified in LiftProject.scala. That file includes this code:

  override def libraryDependencies = Set(
    "net.liftweb"             %% "lift-webkit"   % liftVersion % "compile->default",
    "net.liftweb"             %% "lift-mapper"   % liftVersion % "compile->default",
    "org.mortbay.jetty"       % "jetty"          % "6.1.22"    % "test->default",
    "junit"                   % "junit"          % "4.5"       % "test->default",
    "org.scala-tools.testing" %% "specs"         % "1.6.6"     % "test->default",
    "org.scala-lang"          % "scala-compiler" % "2.8.1"     % "test->default",
    "org.apache.tomcat"       % "tomcat-juli"    % "7.0.0"     % "test->default",
    "com.h2database"          % "h2"             % "1.2.138"
  ) ++ super.libraryDependencies

What do the % and %% operators do here? If I paste this code into the scala interpreter, it errors out, and neither % nor %% is defined for String or RichString. What's going on here?

Codification answered 15/5, 2011 at 22:55 Comment(1)
I applied a bit of formatting to make it more table-like. I hope you don't mind, but, if you do, feel free to revert my edit.Protonema
H
15

The difference between these functions is that %% considers Scala version when SBT resolve dependency, so for example net/liftweb/lift-webkit_2.8.1/2.3/lift-webkit_2.8.1-2.3.jar will be downloaded from repo.

Regarding compile error - these methods should be called when some implicit methods defined in SBT class hierarchy that make actual conversion are in scope.

Best regards, Vladimir

Harald answered 15/5, 2011 at 23:15 Comment(0)
P
8

They control grabbing builds for a specific version of Scala.

% grabs the dependency exactly as you described it.

%% tacks the Scala version into the resource name to fetch a version for the local Scala build. Extra useful.if you crossbuild for several releases of Scala.

Ponceau answered 15/5, 2011 at 23:3 Comment(0)
C
4

Since 2011, the doc got a bit more complete: "Library dependencies ".

The article "Sbt heiroglyphs and multi-projects explained" from Divan Visagie also details those sbt operators:

% and %% get a little tricky: they define the ids and versions of each library in the sequence , but it’s safe to say that:

"org.scala-tools" % "scala-stm_2.11.1" % "0.3"

Is the equivalent of

"org.scala-tools" %% "scala-stm" % "0.3"

So effectively the extra %% means it figures out what Scala version you are on.

The doc adds:

The idea is that many dependencies are compiled for multiple Scala versions, and you’d like to get the one that matches your project to ensure binary compatibility.

The complexity in practice is that often a dependency will work with a slightly different Scala version; but %% is not smart about that.
So if the dependency is available for 2.10.1 but you’re using scalaVersion := "2.10.4", you won’t be able to use %% even though the 2.10.1 dependency likely works.
If %% stops working, just go see which versions the dependency is really built for, and hardcode the one you think will work (assuming there is one).

Cysticercus answered 3/7, 2016 at 18:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.