【问题标题】:How to optionally add a compiler plugin in SBT如何在 SBT 中选择性地添加编译器插件
【发布时间】:2021-08-07 06:25:17
【问题描述】:

我有一个依赖于https://github.com/typelevel/kind-projector 的项目,目前正在针对 scala 2.12 和 2.13 进行交叉编译,我想添加对 scala 3.0 的支持。但是,kind-projector 在 scala 3.0 上不可用,因为它启用的语法是原生 scala 3 语法的一部分。

之前,我使用这个设置来添加编译器插件:

addCompilerPlugin("org.typelevel" % "kind-projector" % "0.11.3" cross CrossVersion.full)

现在,如果 scalaVersion 为 3.0.0,我将尝试禁用该设置。

我得到的最接近的是

Def.setting {
    scalaVersion.value match {
        case "3.0.0" => new Def.SettingList(Nil)
        case _ => Seq(
            addCompilerPlugin("org.typelevel" % "kind-projector" % "0.11.3" cross CrossVersion.full)
        )
    }
}

但类型不起作用(这是一个Initialize,但它必须是一个Setting)。

如何根据 scala 版本有条件地禁用编译器插件?

【问题讨论】:

    标签: scala sbt scala-3


    【解决方案1】:

    addCompilerPluginlibraryDependencies += compilerPlugin(dependency) 的快捷方式

    因此,它应该与这样的东西一起使用

    libraryDependencies ++= {
      scalaVersion.value match {
        case "3.0.0" =>
          Nil
        case _ =>
          List(compilerPlugin("org.typelevel" % "kind-projector" % "0.11.3" cross CrossVersion.full))
      }
    }
    

    不过可能有更好的方法。


    原始答案无效,因为scalaVersion.value 在此上下文中不可用:

    scalaVersion.value match {
      case "3.0.0" =>
        new Def.SettingList(Nil)
      case _ => 
        addCompilerPlugin("org.typelevel" % "kind-projector" % "0.11.3" cross CrossVersion.full)
    }
    

    【讨论】:

    • 不起作用。 value 方法是一个宏,我认为它只适用于某些上下文,即在 := 运算符之后,或在 Def 方法之一内。
    • @Dylan 实际上,我用应该更好的方法更新了我的答案
    • 啊,看起来很有希望。我下班后就可以检查了
    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 2018-11-29
    • 2017-10-01
    • 2016-07-27
    • 2012-01-24
    • 2019-11-17
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多