sbt 0.12.4 

sbt 0.12.3 

sbt 0.12.2 

sbt 0.12.1 

Dependency management fixes: 

  • The resolution cache differs from the repository cache and does not contain dependency metadata or artifacts.
  • The resolution cache contains the generated ivy files, properties, and resolve reports for the project.
  • There will no longer be individual files directly in ~/.ivy2/cache/
  • Resolve reports are now in target/resolution-cache/reports/, viewable with a browser.
  • Cache location includes extra attributes so that cross builds of a plugin do not overwrite each other. Fixes gh-532.

Three stage incremental compilation: 

Miscellaneous fixes and improvements: 

Forward-compatible-only change (not present in 0.12.0): 

sbt 0.12.0 

Features, fixes, changes with compatibility implications 




Experimental or In-progress 

Details of major changes from 0.11.2 to 0.12.0 

Plugin configuration directory 

In 0.11.0, plugin configuration moved from project/plugins/ to just project/, with project/plugins/ being deprecated. Only 0.11.2 had a deprecation message, but in all of 0.11.x, the presence of the old style project/plugins/ directory took precedence over the new style. In 0.12.0, the new style takes precedence. Support for the old style won’t be removed until 0.13.0.

  1. Ideally, a project should ensure there is never a conflict. Both styles are still supported; only the behavior when there is a conflict has changed.
  2. In practice, switching from an older branch of a project to a new branch would often leave an empty project/plugins/ directory that would cause the old style to be used, despite there being no configuration there.
  3. Therefore, the intention is that this change is strictly an improvement for projects transitioning to the new style and isn’t noticed by other projects.

Parsing task axis 

There is an important change related to parsing the task axis for settings and tasks that fixes gh-202

  1. The syntax before 0.12 has been {build}project/config:key(for task)
  2. The proposed (and implemented) change for 0.12 is {build}project/config:task::key
  3. By moving the task axis before the key, it allows for easier discovery (via tab completion) of keys in plugins.
  4. It is not planned to support the old syntax.


Aggregation has been made more flexible. This is along the direction that has been previously discussed on the mailing list.

  1. Before 0.12, a setting was parsed according to the current project and only the exact setting parsed was aggregated.
  2. Also, tab completion did not account for aggregation.
  3. This meant that if the setting/task didn’t exist on the current project, parsing failed even if an aggregated project contained the setting/task.
  4. Additionally, if compile:package existed for the current project, *:package existed for an aggregated project, and the user requested ‘package’ to run (without specifying the configuration), *:package wouldn’t be run on the aggregated project (because it isn’t the same as the compile:package key that existed on the current project).
  5. In 0.12, both of these situations result in the aggregated settings being selected. For example,

    1. Consider a project root that aggregates a subproject sub.
    2. root defines *:package.
    3. sub defines compile:package and compile:compile.
    4. Running root/package will run root/*:package and sub/compile:package
    5. Running root/compile will run sub/compile:compile
  6. This change was made possible in part by the change to task axis parsing.

Parallel Execution 

Fine control over parallel execution is supported as described here: Parallel Execution.

  1. The default behavior should be the same as before, including the parallelExecution settings.
  2. The new capabilities of the system should otherwise be considered experimental.
  3. Therefore, parallelExecution won’t be deprecated at this time.

Source dependencies 

A fix for issue gh-329 is included in 0.12.0. This fix ensures that only one version of a plugin is loaded across all projects. There are two parts to this.

  1. The version of a plugin is fixed by the first build to load it. In particular, the plugin version used in the root build (the one in which sbt is started in) always overrides the version used in dependencies.
  2. Plugins from all builds are loaded in the same class loader.

Additionally, Sanjin’s patches to add support for hg and svn URIs are included.

  1. sbt uses subversion to retrieve URIs beginning with svn or svn+ssh. An optional fragment identifies a specific revision to checkout.
  2. Because a URI for mercurial doesn’t have a mercurial-specific scheme, sbt requires the URI to be prefixed with hg: to identify it as a mercurial repository.
  3. Also, URIs that end with .git are now handled properly.

Cross building 

The cross version suffix is shortened to only include the major and minor version for Scala versions starting with the 2.10 series and for sbt versions starting with the 0.12 series. For example, sbinary_2.10 for a normal library or sbt-plugin_2.10_0.12 for an sbt plugin. This requires forward and backward binary compatibility across incremental releases for both Scala and sbt.

  1. This change has been a long time coming, but it requires everyone publishing an open source project to switch to 0.12 to publish for

    1. 10 or adjust the cross versioned prefix in their builds appropriately.
  2. Obviously, using 0.12 to publish a library for 2.10 requires 0.12.0 to be released before projects publish for 2.10.
  3. There is now the concept of a binary version. This is a subset of the full version string that represents binary compatibility. That is, equal binary versions implies binary compatibility. All Scala versions prior to 2.10 use the full version for the binary version to reflect previous sbt behavior. For 2.10 and later, the binary version is <major>.<minor>.
  4. The cross version behavior for published artifacts is configured by the crossVersion setting. It can be configured for dependencies by using the cross method on ModuleID or by the traditional %% dependency construction variant. By default, a dependency has cross versioning disabled when constructed with a single % and uses the binary Scala version when constructed with %%.
  5. The artifactName function now accepts a type ScalaVersion as its first argument instead of a String. The full type is now (ScalaVersion, ModuleID, Artifact) => String. ScalaVersion contains both the full Scala version (such as 2.10.0) as well as the binary Scala version (such as 2.10).
  6. The flexible version mapping added by Indrajit has been merged into the cross method and the %% variants accepting more than one argument have been deprecated. See Cross Build for details.

Global repository setting 

Define the repositories to use by putting a standalone [repositories] section (see the sbt Launcher page) in ~/.sbt/repositories and pass to sbt. Only the repositories in that file will be used by the launcher for retrieving sbt and Scala and by sbt when retrieving project dependencies. (@jsuereth)


test-quick (gh-393) runs the tests specified as arguments (or all tests if no arguments are given) that:

  1. have not been run yet OR
  2. failed the last time they were run OR
  3. had any transitive dependencies recompiled since the last successful run

Argument quoting 

Argument quoting (gh-396) from the intereactive mode works like Scala string literals.

  1. > command "arg with spaces,\n escapes interpreted"
  2. > command """arg with spaces,\n escapes not interpreted"""
  3. For the first variant, note that paths on Windows use backslashes and need to be escaped (). Alternatively, use the second variant, which does not interpret escapes.
  4. For using either variant in batch mode, note that a shell will generally require the double quotes themselves to be escaped.


sbt versions prior to 0.12.0 provided the location of scala-library.jar to scalac even if scala-library.jar wasn’t on the classpath. This allowed compiling Scala code without scala-library as a dependency, for example, but this was a misfeature. Instead, the Scala library should be declared as provided:

// Don't automatically add the scala-library dependency
// in the 'compile' configuration
autoScalaLibrary := false

libraryDependencies += "org.scala-lang" % "scala-library" % "2.9.2" % "provided"


sbt Reference Manual
      1. sbt 0.12.4