【问题标题】:Clarifying cross version behavior in Scala阐明 Scala 中的跨版本行为
【发布时间】:2021-05-22 12:24:43
【问题描述】:

我想知道这两者有什么区别:

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%%%。有什么区别?

【问题讨论】:

    标签: scala sbt kind-projector


    【解决方案1】:

    我很确定它们是一样的。

    来自Overriding the publishing convention

    crossVersion 设置可以覆盖发布约定:

    • CrossVersion.disabled(无后缀)
    • CrossVersion.binary (_)
    • CrossVersion.full (_)

    默认为CrossVersion.binaryCrossVersion.diabled,具体取决于crossPaths 的值。

    来自More about using cross-built libraries

    这些是等价的:

    "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,在dep1dep2 中都是Full(, )。不同于其他两个Disabled()Binary(, )

    【讨论】:

    • 我喜欢细节并接受它作为答案。但是,我仍然对投影机的人们的意图感到困惑。他们到底想做什么?
    • @MaatDeamon,我真的不确定。也许打开一个 github 问题来澄清这将更有意义。我找不到原因。
    • 好主意,会的!谢谢??
    • @MaatDeamon,如果您打开问题,请在此处粘贴其链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多