我想知道这两者有什么区别:
addCompilerPlugin("org.typelevel" %% "kind-projector" % "0.11.3" cross CrossVersion.full)
// if your project uses multiple Scala versions, use this for cross building
addCompilerPlugin("org.typelevel" % "kind-projector" % "0.11.3" cross CrossVersion.full)
我的理解是
cross CrossVersion.full
将完整的Scala版本添加到库中,例如
kind-project_2.13.4:0.11.3
并且
%%
添加了 Scala 二进制版本,例如
kind-project_2.13:0.11.3
因此我不明白为什么我们需要
cross CrossVersion.full
以及%
和%%
。有什么区别?
我很确定它们是一样的。
来自超越发布约定:
crossVersion 设置可以覆盖发布约定:
(无后缀)CrossVersion.disabled
(_)CrossVersion.binary
(_)CrossVersion.full
默认为
或CrossVersion.binary
,具体取决于 crossPaths 的值。CrossVersion.disabled
来自 有关使用交叉构建库的更多信息:
这些是等效的:
"a" %% "b" % "1.0" ("a" % "b" % "1.0").cross(CrossVersion.binary)
crossVersion
的价值。
为了测试
crossVersion
,我在我的build.sbt
中创建了一个简单的任务:
lazy val getVersion = taskKey[Unit]("A simple task")
getVersion := {
List(dep1, dep2, dep3, dep4).foreach { d =>
val att = Seq(d.organization ,d.name ,d.revision ,d.configurations ,d.isChanging ,d.isTransitive ,d.isForce ,d.explicitArtifacts ,d.inclusions ,d.exclusions ,d.extraAttributes ,d.crossVersion ,d.branchName)
println(att)
}
}
lazy val dep1 = "org.typelevel" % "kind-projector" % "0.11.3" cross CrossVersion.full
lazy val dep2 = "org.typelevel" %% "kind-projector" % "0.11.3" cross CrossVersion.full
lazy val dep3 = "org.typelevel" % "kind-projector" % "0.11.3"
lazy val dep4 = "org.typelevel" %% "kind-projector" % "0.11.3"
sbt getVersion
的输出为:
List(org.typelevel, kind-projector, 0.11.3, None, false, true, false, Vector(), Vector(), Vector(), Map(), Full(, ), None)
List(org.typelevel, kind-projector, 0.11.3, None, false, true, false, Vector(), Vector(), Vector(), Map(), Full(, ), None)
List(org.typelevel, kind-projector, 0.11.3, None, false, true, false, Vector(), Vector(), Vector(), Map(), Disabled(), None)
List(org.typelevel, kind-projector, 0.11.3, None, false, true, false, Vector(), Vector(), Vector(), Map(), Binary(, ), None)
正如我们所见,除了
crossVersion
之外,所有模块都是等效的,dep1
和dep2
都是Full(, )
。与另外两个不同的是 Disabled()
和 Binary(, )
。