Что делают операторы% и %% при настройке зависимостей SBT?

В платформе Lift Web Framework зависимости для Simple Build Tool (SBT) указаны в LiftProject.scala. Этот файл содержит этот код:

  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

Что делают операторы% и %%? Если я вставляю этот код в интерпретатор scala, он выдает ошибку, и ни один из% или %% не определен для String или RichString. Что здесь происходит?

Ответы

Ответ 1

Разница между этими функциями заключается в том, что %% рассматривает версию Scala, когда зависимость разрешения SBT, так например net/liftweb/lift-webkit_2.8.1/2.3/lift-webkit_2.8.1-2.3.jar будет загружена из репо.

Что касается ошибки компиляции - эти методы следует вызывать, когда некоторые неявные методы, определенные в иерархии классов SBT, которые делают фактическое преобразование, находятся в области видимости.

С уважением, Владимир

Ответ 2

Они управляют сборками для конкретной версии Scala.

% захватывает зависимость точно так, как вы ее описали.

%% использует версию Scala в имени ресурса для извлечения версии для локальной сборки Scala. Дополнительная полезность. Если вы перекрестно построили несколько выпусков Scala.

Ответ 3

С 2011 года документ стал более полным: "" Зависимости библиотек".

В статье " описаны эйроглифы Sbt и многопроекты" из Divan Visagie также подробно описывает операторы sbt:

% и %% получают немного сложнее: они определяют идентификаторы и версии каждой библиотеки в последовательности, но ее можно с уверенностью сказать, что:

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

Является ли эквивалент

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

Таким образом, дополнительный %% означает, что он вычисляет, какую версию Scala вы используете.

Документ добавляет:

Идея заключается в том, что многие зависимости скомпилированы для нескольких версий Scala, и youd хотел бы получить тот, который соответствует вашему проекту, чтобы обеспечить совместимость с двоичными файлами.

Сложность на практике заключается в том, что часто зависимость будет работать с немного другой версией Scala; но %% не разбирается в этом.
Поэтому, если зависимость доступна для 2.10.1, но вы используете scalaVersion := "2.10.4", вы не сможете использовать %%, даже если зависимость 2.10.1, вероятно, работает.
Если %% перестает работать, просто посмотрите, в каких версиях действительно создана зависимость, а hardcode - тот, который, по вашему мнению, будет работать (предполагается, что он есть).