Что означает "str" % "str" в SBT?

Я натолкнулся на этот код:

import sbt._ 

class AProject(info: ProjectInfo) extends DefaultProject(info) { 
  val scalaToolsSnapshots = ScalaToolsSnapshots
  val scalatest = "org.scalatest" % "scalatest" %
    "1.0.1-for-scala-2.8.0.RC1-SNAPSHOT"
}

И я довольно смущен тем, что содержит scalatest, и что делает %.

Ответ 1

Если вы использовали Maven, это по сути то же самое, но с Scala DSL. % работает как разделитель:

<dependency>
      <groupId>org.scalatest</groupId>
      <artifactId>scalatest</artifactId>
      <version>1.0.1-for-scala-2.8.0.RC1-SNAPSHOT</version>      
</dependency>

Подробнее: http://code.google.com/p/simple-build-tool/wiki/LibraryManagement

Ответ 2

Он объявляет зависимость. В частности,

val scalatest = "org.scalatest" % "scalatest" % "1.0.1-for-scala-2.8.0.RC1-SNAPSHOT

относится к зависимости, которая может быть найдена при

http://scala-tools.org/repo-snapshots/org/scalatest/scalatest/1.0.1-for-scala-2.8.0.RC1-SNAPSHOT/

Где все до org относится к репозиторию, который (предварительно) определен в другом месте.

Нелегко найти неявный, который позволяет % на String, но для записи он найден на ManagedProject, преобразуя a String в GroupID. В том же признаке есть еще один неявный, который позволяет использовать метод at.

Во всяком случае, неявный превратит первый String в GroupID, первый % возьмет String, представляющий идентификатор артефакта, и вернет a GroupArtifactID, а второй возьмет String, представляющий ревизию, и возвращает a ModuleID, что, наконец, присваивается scalatest.