%和%%运算符在设置SBT依赖项时会做什么?

时间:2011-05-15 22:55:40

标签: scala lift sbt

在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定义%或%%。这是怎么回事?

3 个答案:

答案 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依赖关系可能有效,您也无法使用%%
  如果%%停止工作,只需查看依赖项实际构建的版本,并对您认为可行的版本进行硬编码(假设有一个版本)。