当设置SBT依赖项时,%和%%运算符是什么意思?

18
在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 类型中都没有定义 % 或 %% 运算符。这是怎么回事呢?


2
我进行了一些格式化,使其更像表格。希望你不介意,但如果你介意的话,请随时撤销我的编辑。 - Daniel C. Sobral
3个回答

15
这些函数的区别在于,当SBT解析依赖时,%%会考虑Scala版本,因此例如net/liftweb/lift-webkit_2.8.1/2.3/lift-webkit_2.8.1-2.3.jar将从仓库中下载。
关于编译错误 - 只有在SBT类层次结构中定义了一些隐式方法并处于作用域中时,才应调用这些方法。
敬礼, 弗拉基米尔

8

他们控制抓取特定版本的Scala构建。

% 精确地获取你描述的依赖项。

%% 在资源名称中附加Scala版本,以获取本地Scala构建的版本。如果你为多个Scala版本进行交叉构建,这将非常有用。


4
自2011年以来,该文档变得更加完整:“库依赖”。
文章“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依赖项可能有效,您也无法使用%%。如果%%停止工作,请查看依赖项实际构建的版本,并硬编码您认为可行的版本(假设有一个)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接