首页 > 解决方案 > 如何在 SBT 中选择性地添加编译器插件

问题描述

我有一个依赖于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)
        )
    }
}

但类型不起作用(这是 aInitialize但它必须是 a Setting)。

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

标签: scalasbtscala-3

解决方案


addCompilerPlugin是一个捷径libraryDependencies += 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)
}

推荐阅读