SBT 插件:如何将编译器插件添加为不向下游传播的依赖项?

Posted

技术标签:

【中文标题】SBT 插件:如何将编译器插件添加为不向下游传播的依赖项?【英文标题】:SBT Plugin: How to add compiler plugin as a dependency that is not propagated downstream? 【发布时间】:2017-10-01 03:03:10 【问题描述】:

我正在编写一个 SBT 插件。我想使用 Circe JSON 库,但它需要 Scala 2.10 上的 Macro Paradise 编译器插件。

通常您将编译器插件添加到 build.sbt 并将 SBT 插件添加到 project/plugins.sbt

现在,当您构建 SBT 插件时,其他插件成为依赖项,因此您将它们放入 build.sbt,它们会传播到您使用 SBT 插件的项目。

当我将以下 sn-p 放入我的 SBT 插件的build.sbt 时:

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

Paradise 编译器插件会传播到下游项目吗?

【问题讨论】:

【参考方案1】:

编译器插件默认不传播,但实际上下游用户会需要它们作为依赖项,你没有办法绕过这个要求。

原因很简单,他们的代码会在不同的编译单元中编译,所以只要你有依赖于最终代码库中的编译器插件的功能,你还需要贴一个注释在此插件上显式添加依赖项。

希望这会有所帮助,并以非常流行的 Monocle 库 here 为例。例如,注释不会在没有天堂的情况下扩展,所以这完全是最终用户需要什么的问题。

引用

如果要使用@Lenses 等宏注解,还需要包含:

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

【讨论】:

如何强制传播?在我的情况下,我确实希望在我的插件中添加的 addCompilerPlugin 能够向下游传播到插件的使用者。 @Wonay 我不认为你可以,除非有一些 SBT 设置可以强制将其保留在类路径中。

以上是关于SBT 插件:如何将编译器插件添加为不向下游传播的依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

Sbt Plugin 添加依赖到 project/build.sbt

如何将任务依赖项从另一个插件添加到我的 SBT 插件?

如何将 sbt pack 插件导入项目

如何将 sbteclipse 插件添加到 SBT 0.10.x

将文件从 sbt 插件复制到项目文件夹

您可以从 sbt 提示符注入编译器插件吗?