在Lift Web Framework中,简单构建工具(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定义%或%%。这是怎么回事?
答案 0 :(得分:14)
这些函数之间的区别在于,%%
在SBT解析依赖关系时会考虑Scala版本,因此例如将从repo下载net/liftweb/lift-webkit_2.8.1/2.3/lift-webkit_2.8.1-2.3.jar
。
关于编译错误 - 当SBT类层次结构中定义的实际转换的一些隐式方法在范围内时,应调用这些方法。
祝你好运, 弗拉基米尔
答案 1 :(得分:8)
他们控制特定版本的Scala的抓取版本。
%完全按照您的描述获取依赖关系。
%%将Scala版本添加到资源名称中以获取本地Scala版本的版本。如果你为几个版本的Scala进行交叉构建,那就太有用了。
答案 2 :(得分:1)
自2011年以来,该文档更加完整:" Library dependencies "。
文章" Sbt heiroglyphs and multi-projects explained"来自Divan Visagie还详细介绍了那些sbt运算符:
%
和%%
有点棘手:它们定义了序列中每个库的ID和版本,但可以肯定地说:
"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依赖关系可能有效,您也无法使用%%
。
如果%%
停止工作,只需查看依赖项实际构建的版本,并对您认为可行的版本进行硬编码(假设有一个版本)。