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
中添加addCompilerPlugin
和enablePlugins
,因为other plugins
。
我在my own plugin
的build.sbt
中添加了other plugins
。
我应该将addCompilerPlugin
和enablePlugins
放在我的插件中的什么位置,这样consumer project
就不必自己动手了?
谢谢
【问题讨论】:
【参考方案1】:addCompilerPlugin
只是修改特定设置键的快捷方式,而enablePlugins
是修改项目配置本身的方法。因此,这些事情处于不同的级别,因此根据您的目的进行不同的处理。
为确保启用您的插件也会启用其他插件,您需要修改插件中的requires
声明:
object YourPlugin extends AutoPlugin
override def requires: Plugins = FirstDependencyPlugin & SecondDependencyPlugin
现在,当您的插件添加到项目中时:
lazy val someProject = project.enablePlugins(YourPlugin)
那么FirstDependencyPlugin
和SecondDependencyPlugin
插件也将被启用。
要启用编译器插件,您只需要确保您的插件提供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 插件:传播编译器插件并在下游启用插件的主要内容,如果未能解决你的问题,请参考以下文章