My favorites | Sign in
Project Logo
                
Search
for
Updated Sep 29, 2009 by dmharrah
ManagedConfigurations  

Configurations

Introduction

Ivy configurations are a useful feature for your build when you use managed dependencies. They are essentially named sets of dependencies. You can read the full Ivy documentation for details. Their use in sbt is described on this page.

Usage

The built-in use of configurations in sbt is similar to scopes in Maven. sbt adds dependencies to different classpaths by the configuration that they are defined in. See the description of Maven Scopes for details.

You put a dependency in a configuration by selecting one or more of its configurations to map to one or more of your project's configurations. The most common case is to have one of your configurations A use a dependency's configuration B. The mapping for this looks like "A->B". To apply this mapping to a dependency, add it to the end of your dependency definition:

  val st = "org.scala-tools.testing" % "scalatest" % "0.9.5" % "test->default"

This says that your project's test configuration uses ScalaTest's default configuration. Again, see the Ivy documentation for more advanced mappings. Most projects published to Maven repositories will use the default or compile configuration. sbt itself, however, publishes different jars to different configurations for each version of Scala that it supports. The jar compiled against Scala 2.7.5 is published to the "2.7.5" configuration. This is probably atypical, however, and the better solution for this particular case is to use cross-building.

A more useful application of configurations is to group dependencies that are not used on classpaths. For example, your might use a "js" configuration to automatically download jQuery and then include it in your jar by overriding mainResources. This is what Scala X-Ray does, for example:

  def jquery_version = "1.3.2"
  val js = config("js") hide
  val jquery = "jquery" % "jquery" % jquery_version % "js->default" from ("http://jqueryjs.googlecode.com/files/jquery-" + jquery_version + ".min.js")
  override def mainResources = super.mainResources +++ descendents(configurationPath(js) ##, "*.js")

The config method defines a new configuration with name "js" and makes it private to the project so that it is not used for publishing.

As of sbt 0.5.5, a configuration without a mapping (no "->") is mapped to default or compile. The -> is only needed when mapping to a different configuration than those. The ScalaTest dependency above can then be shortened to:

  val st = "org.scala-tools.testing" % "scalatest" % "0.9.5" % "test"

Comment by saurabh.raje.work, Nov 20, 2009

one of the use of configurations we do is to define different dependencies for compiletime (conf=compile; to be used on javac classpath) & runtime (conf=runtime; to be packaged in war). one example that comes to mind is servlet jar's.

how can this be done using sbt?

Comment by dmharrah, Nov 20, 2009

By default, sbt handles configurations like "compile", "provided", "test", and "runtime" like maven scopes. So, if you declare a dependency as "provided", it will be on your compile classpath, but not your runtime.

Does that answer your question?

Comment by saurabh.raje.work, Nov 20, 2009

Cool, that's what I am looking for. Thanks.


Sign in to add a comment
Hosted by Google Code