2011-05-15 19 views
15

En Lift Web Framework, las dependencias de Simple Build Tool (SBT) se especifican en LiftProject.scala. Ese archivo incluye este código:¿Qué hacen los operadores% y %% cuando configuran las dependencias SBT?

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 

¿Qué hacen los operadores% y %% aquí? Si pego este código en el intérprete de scala, se produce un error, y ni% ni %% se define para String o RichString. ¿Que está pasando aqui?

+2

Apliqué un poco de formato para hacerlo más como una mesa. Espero que no te importe, pero si lo haces, puedes revertir mi edición. –

Respuesta

8

Controlan las construcciones de agarre para una versión específica de Scala.

% capta la dependencia exactamente como lo describió.

%% tacha la versión de Scala en el nombre del recurso para buscar una versión para la construcción local de Scala. Es muy útil. Si haces crossbuild para varios lanzamientos de Scala.

14

La diferencia entre estas funciones es que %% considera la versión de Scala cuando SBT resuelve la dependencia, por lo que, por ejemplo, net/liftweb/lift-webkit_2.8.1/2.3/lift-webkit_2.8.1-2.3.jar se descargará del repositorio.

Relativo al error de compilación: estos métodos deben invocarse cuando algunos métodos implícitos definidos en la jerarquía de clases SBT que hacen la conversión real están dentro del alcance.

Saludos, Vladimir

+1

esto es demasiado mágico ... podrían haber intentado algo más explícito que esto ... –

0

Desde 2011, el Departamento de Comercio se pusieron un poco más completa: "Library dependencies".

El artículo "Sbt heiroglyphs and multi-projects explained" de Divan Visagie también detalla los operadores SBT:

% y %% ser un poco complicado: definen los identificadores y las versiones de cada biblioteca en la secuencia, pero es seguro decir que :

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

es el equivalente de

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

Así que efectivamente el extra %% significa que se da cuenta de qué versión Scala que se encuentra.

El documento añade:

La idea es que muchas dependencias se compilan para múltiples versiones Scala, y que le gustaría conseguir el que coincida con el proyecto para asegurar la compatibilidad binaria.

La complejidad en la práctica es que a menudo una dependencia funciona con una versión de Scala ligeramente diferente; pero %% no es inteligente al respecto.
Entonces, si la dependencia está disponible para 2.10.1 pero está usando scalaVersion := "2.10.4", no podrá usar %% aunque la dependencia 2.10.1 probablemente funcione.
Si %% deja de funcionar, simplemente vaya a ver para qué versiones está realmente construida la dependencia, y codifique la que cree que funcionará (suponiendo que exista).

Cuestiones relacionadas