【问题标题】:Cats-tagless - Scala macro annotation errorCats-tagless - Scala 宏注释错误
【发布时间】:2019-04-14 13:25:23
【问题描述】:

我使用cats-tagless lib 创建了一个简单的trait

@finalAlg
@autoFunctorK(true)
trait MyService[F[_]] {

  def put(element: Element): F[Element]

  def get(elementId: Id): F[Element]

  def all(): F[List[Element]]

  def delete(elementId: Id): F[Unit]
}

但是当我尝试编译它时,我得到了一个错误:

Error:(8, 7) macro annotation could not be expanded (the most common reason for that is that you need to enable the macro paradise plugin; another possibility is that you try to use macro annotation in the same compilation run that defines it)

我还将addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full) 添加到plugins.sbt 文件和build.sbt 中,但没有帮助。你能帮我解决吗?

我的build.sbt 文件如下所示:

addCompilerPlugin(("org.scalameta" % "paradise" % "3.0.0-M11").cross(CrossVersion.full))

lazy val commonSettings = Seq(
  libraryDependencies ++= Seq(
    "org.typelevel" %% "cats-core" % CatsVersion,
    "org.typelevel" %% "cats-effect" % "1.2.0",
    "org.typelevel" %% "cats-tagless-macros" % "0.5",
    "org.typelevel" %% "cats-tagless-legacy-macros" % "0.5",
    "org.typelevel" %% "cats-mtl-core" % "0.5.0",
  )
)

【问题讨论】:

  • 什么是CatsVersion
  • 目前为 1.6.0
  • 是的,我在模块algebra 中使用它,在那里我创建了服务trait。像这样使用它lazy val algebra = (project in file("algebra")) .settings(commonSettings)

标签: scala scala-macros scala-cats scala-macro-paradise


【解决方案1】:

在一个空的新项目中使用这个build.sbt

scalaVersion := "2.12.8"

libraryDependencies ++= Seq(
  "org.typelevel" %% "cats-tagless-macros" % "0.5",
  "org.typelevel" %% "cats-tagless-legacy-macros" % "0.5"
)

addCompilerPlugin(
  "org.scalameta" % "paradise" % "3.0.0-M11" cross CrossVersion.full
)

这段代码:

import cats.tagless._

case class Element()
case class Id()

@finalAlg
@autoFunctorK(true)
trait MyService[F[_]] {
  def put(element: Element): F[Element]
  def get(elementId: Id): F[Element]
  def all(): F[List[Element]]
  def delete(elementId: Id): F[Unit]
}

编译得很好,正如 here 所宣传的那样。

如果我删除 addCompilerPlugin("org.scalameta" % "paradise" % "3.0.0-M11" cross CrossVersion.full),我会收到相同的错误消息:

无法扩展宏注解(最常见的原因是您需要启用宏天堂插件;另一种可能是您尝试在定义它的同一编译运行中使用宏注解)

同样,这是记录在案的,链接页面说:

宏注解(@finalAlg、@autoFunctorK、@autoInvariantK等)仍然依赖scalameta,所以需要在build.sbt中添加scalameta依赖。

所以看来你需要它是因为@finalAlg@autoFunctorK

请注意,我没有修改 project/ 中的任何内容。


编辑

如果您有多个子项目,则必须将编译器插件添加到实际需要它的子项目中。请注意

addCompilerPlugin(foobar)

本质上只是

libraryDependencies += compilerPlugin(foobar)

所以在你的情况下,你可能应该尝试类似

  libraryDependencies ++= Seq(
    "org.typelevel" %% "cats-core" % "1.6.0",
    "org.typelevel" %% "cats-effect" % "1.2.0",
    "org.typelevel" %% "cats-tagless-macros" % "0.5",
    "org.typelevel" %% "cats-tagless-legacy-macros" % "0.5",
    "org.typelevel" %% "cats-mtl-core" % "0.5.0",
    compilerPlugin(("org.scalameta" % "paradise" % "3.0.0-M11")
      .cross(CrossVersion.full))
  )

然后将其添加到您的 algebra 子项目中。

【讨论】:

  • 我将 addCompilerPlugin( ("org.scalameta" % "paradise" % "3.0.0-M11").cross(CrossVersion.full))"org.typelevel" %% "cats-tagless-macros" % latestVersion"org.typelevel" %% "cats-tagless-legacy-macros" % latestVersion 添加到 build.sbt 并没有帮助
  • @allocer 在什么意义上它没有帮助?有上千种可能出错的地方,没有合适的 MCVE 是不可能找出来的。
  • @allocer 我制作了一个重现错误的示例,然后我展示了一个避免错误的build.sbt。如果您有其他一些不起作用的示例,那么您必须展示它。
  • @allocer 到目前为止我的最后一个猜测:请看一下编辑。我猜你以某种方式将插件添加到错误的子项目中。
  • 太棒了,它有助于将 compilerPlugin(("org.scalameta" % "paradise" % "3.0.0-M11")(CrossVersion.full)) 移动到 commonSettings。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 2022-09-30
  • 2018-07-20
  • 2020-04-04
  • 1970-01-01
相关资源
最近更新 更多