【问题标题】:SBT Plugin: Propagate Compiler Plugin and Enable Plugin downstreamSBT 插件:传播编译器插件并在下游启用插件
【发布时间】: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 就不必自己动手了?

谢谢

【问题讨论】:

    标签: scala sbt sbt-plugin


    【解决方案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 不变。消费者将不得不自己添加其他插件。
    猜你喜欢
    • 2021-05-22
    • 2017-10-01
    • 2014-06-22
    • 2013-05-30
    • 2015-08-23
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    相关资源
    最近更新 更多