从 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/