Что делают операторы% и %% при настройке зависимостей 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 - тот, который, по вашему мнению, будет работать (предполагается, что он есть).