Что делают операторы% и %% при настройке зависимостей SBT? - PullRequest
15 голосов
/ 16 мая 2011

В 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.Что здесь происходит?

Ответы [ 3 ]

14 голосов
/ 16 мая 2011

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

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

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

8 голосов
/ 16 мая 2011

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

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

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

1 голос
/ 03 июля 2016

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

В статье " Sbt heiroglyphs and multi-projects объяснено " из Divan Visagie также подробно описаны эти операторы sbt:

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

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

Это эквивалент

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

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

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

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

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

...