SBT 插件:传播编译器插件并在下游启用插件

Posted

技术标签:

【中文标题】SBT 插件:传播编译器插件并在下游启用插件【英文标题】:SBT Plugin: Propagate Compiler Plugin and Enable Plugin downstream 【发布时间】:2019-05-18 06:23:21 【问题描述】:

我看到了SBT Plugin: How to add compiler plugin as a dependency that is not propagated downstream?,但这并不能回答我的问题。

结构如下:

other plugins
    |-----> added to my own plugin
                |-----> Consumer project

consumer project 需要在自己的build.sbt 中添加addCompilerPluginenablePlugins,因为other plugins

我在my own pluginbuild.sbt 中添加了other plugins

我应该将addCompilerPluginenablePlugins 放在我的插件中的什么位置,这样consumer project 就不必自己动手了?

谢谢

【问题讨论】:

【参考方案1】:

addCompilerPlugin 只是修改特定设置键的快捷方式,而enablePlugins 是修改项目配置本身的方法。因此,这些事情处于不同的级别,因此根据您的目的进行不同的处理。

为确保启用您的插件也会启用其他插件,您需要修改插件中的requires 声明:

object YourPlugin extends AutoPlugin 
  override def requires: Plugins = FirstDependencyPlugin & SecondDependencyPlugin

现在,当您的插件添加到项目中时:

lazy val someProject = project.enablePlugins(YourPlugin)

那么FirstDependencyPluginSecondDependencyPlugin 插件也将被启用。

要启用编译器插件,您只需要确保您的插件提供addCompilerPlugin返回的设置定义:

object YourPlugin extends AutoPlugin 
  override def projectSettings: Seq[Def.Setting[_]] = super.projectSettings ++ Vector(
    addCompilerPlugin("com.example" % "some-plugin" % "1.2.3")
  )

现在,当你的插件添加到项目中时,它提供的Def.Setting[_]会自动应用到这个项目中,它会使用指定的编译器插件来构建你的代码。

【讨论】:

谢谢!如果我也不想启用自己的项目怎么办? 不确定我是否理解您的问题。 “启用我自己的项目”是什么意思? 即使在消费者项目中我也不想打电话给enablePlugins 我明白了。有一个叫做triggered plugins 的东西,它基本上是一种自动启用插件的方法只要另一个插件被启用。您可以尝试使您的插件依赖于某些始终启用的插件并使其触发;但这样你的插件将无法自动拉取其他依赖项。我不认为有办法做到这两点。 啊 :( 太糟糕了。我决定让我的插件始终保持在trigger: allRequirements + requires 不变。消费者将不得不自己添加其他插件。

以上是关于SBT 插件:传播编译器插件并在下游启用插件的主要内容,如果未能解决你的问题,请参考以下文章

SBT 插件 %%% 在哪里定义?

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

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

SBT插件——编译前执行自定义任务

在另一个 SBT 插件中显式启用 SBT 插件

scala 2.13 - 编译插件时出错