Sbt 插件与编译器插件

Sbt Plugins vs Compiler Plugins

我试图理解为什么在项目的 plugins.sbt 中添加 sbt 插件,工作得很好,但是如果我在该文件中添加编译器插件,它就不起作用了?

我认为项目中的任何 .sbt 或 .scala 文件都可用于构建定义。

编译器插件工作的唯一地方是 build.sbt。因此我很困惑为什么?

特别是我正在使用 Kind-Projector

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

我看到函数的以下别名

/** Adds `dependency` to `libraryDependencies` in the auto-compiler plugin configuration. */
def addCompilerPlugin(dependency: ModuleID): Setting[Seq[ModuleID]] =
libraryDependencies += compilerPlugin(dependency)

因此只是想了解,是什么让它只能添加到 build.sbt 而不能添加到项目/

中的 plugins.sbt

记住 sbt 是递归的。

.sbt定义当前层可用的东西。
.scala 个文件定义了将在下一层中可用的薄层。

project/bar.sbt 中添加 sbt 插件就是将该插件添加到元层,因此元层编译 sbt 你正在用来编译你的项目将这些插件添加到下一个 sbt 层。

因此,如果您在 project/foo.sbt 中添加编译器插件,那么您就是将该编译器插件添加到用于编译项目 (meta) 层的编译器 sbt,但在sbt的当前层将不可用。这就是为什么在 build.sbt 文件中添加编译器插件的原因,所以它们被添加到用于编译代码的编译器中。