sbt - 使用宏天堂并与 2.12/2.13 交叉编译

标签 sbt

从 Scala 2.13 开始,macro-paradise已内联在编译器中,可通过编译器标志获得:

Compile / scalacOptions += "-Ymacro-annotations"

作为引用,在以前的 Scala 版本中,macro-paradise 可通过编译器插件获得:

addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full)

在针对 Scala 2.12 和 2.13 的构建中,根据 Scala 版本的值,有条件地添加第一个设置或第二个设置的规范方法是什么?

我想写以下内容,但不起作用:

CrossVersion.partialVersion(scalaVersion.value) match {
  case Some((2, n)) if n >= 13 => Compile / scalacOptions += "-Ymacro-annotations"
  case _ => addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full)
}

它失败并出现以下错误:
error: `value` can only be used within a task or setting macro, such as :=, +=, ++=, Def.task, or Def.setting.
      CrossVersion.partialVersion(scalaVersion.value) match {
                                               ^

同时,我可以使用以下解决方法,但我希望支持更简单的解决方案:

Compile / scalacOptions ++= {
  CrossVersion.partialVersion(scalaVersion.value) match {
    case Some((2, n)) if n >= 13 => "-Ymacro-annotations" :: Nil
    case _ => Nil
  }
}

libraryDependencies ++= {
  CrossVersion.partialVersion(scalaVersion.value) match {
    case Some((2, n)) if n >= 13 => Nil
    case _ => compilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full) :: Nil
  }
}

最佳答案

如果你想写

CrossVersion.partialVersion(scalaVersion.value) match {
  case Some((2, n)) if n >= 13 => Compile / scalacOptions += "-Ymacro-annotations"
  case _ => addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full)
}

一种选择是定义 SBT custom command像这样
def compileWithMacroParadise: Command = Command.command("compileWithMacroParadise") { state =>
  import Project._
  val extractedState = extract(state)
  val stateWithMacroParadise = CrossVersion.partialVersion(extractedState.get(scalaVersion)) match {
    case Some((2, n)) if n >= 13 => extractedState.appendWithSession(Seq(Compile / scalacOptions += "-Ymacro-annotations"), state)
    case _ => extractedState.appendWithSession(addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full), state)
  }
  val (stateAfterCompileWithMacroParadise, _) = extract(stateWithMacroParadise).runTask(Compile / compile, stateWithMacroParadise)
  stateAfterCompileWithMacroParadise
}

commands ++= Seq(compileWithMacroParadise),
addCommandAlias("compile", "compileWithMacroParadise")
sbt compile现在应该在运行 stateWithMacroParadise 之前对构建状态( compile )进行适当的修改任务。

关于sbt - 使用宏天堂并与 2.12/2.13 交叉编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54392266/

相关文章:

scala - 无法将环境变量传递给 intellij 中的 sbt 任务

scala - 对象 gatling 不是包 io 的成员

scala - 更改 build.sbt 自定义任务中的版本

scala - 如何解决 "Error:scalac: bad symbolic reference to scala.ScalaObject encountered in class file ' package.class'”?

scala - 在 sbt 中与 2.10.0 交叉构建

scala - 值isBlank不是String的成员

java - 为什么弃用警告会导致 SBT 中出现编译错误

java - 如何使用 java -jar 或 java -cp 命令运行 Sbt 打包 Jar?

scala - 针对不同的启动器版本交叉构建 sbt 插件?

java - 使用 sbt 测试 Guava 代码时出现 IncompatibleClassChangeError