Sbt autoplugin 覆盖项目设置

Posted

技术标签:

【中文标题】Sbt autoplugin 覆盖项目设置【英文标题】:Sbt autoplugin to override project settings 【发布时间】:2018-04-09 00:59:06 【问题描述】:

我正在尝试开发一个非常小的自动插件来覆盖所有项目和子项目的本地配置。具体来说,我希望我的插件更改 scalaVersion 并向包含它的项目的 scalacOptions 添加一个选项。 I have read in the documentation 可以更改分配设置的顺序,但似乎我没有将它们分配给正确的项目。 这是我到目前为止的代码:

// build.sbt 
import AddSettings._ 

lazy val root = (project in file(".")) 
  .settingSets(userSettings, defaultSbtFiles, autoPlugins, buildScalaFiles)
  .settings( 
     sbtPlugin := true, 
     name := "sbt-scalafix-config",
     organization := "io.prl-prg", 
     version := "0.0.1", 
     addSbtPlugin("org.some" % "some-other-plugin" % "0.5.3")
   ) 

// PluginCode.scala 

package config 
import sbt._ 
import sbt.Keys._ 

object PluginCode extends AutoPlugin 
  override def trigger = allRequirements 
  override lazy val projectSettings = Seq(
    scalaVersion := "2.12.3", 
    scalacOptions := Seq( "-Yrangepos" )
  )
  println("[PluginCode Setup] Hello World!")

感谢任何帮助。

【问题讨论】:

【参考方案1】:

你真的不想使用addSettings,因为

    它可能会破坏您构建中所有其他 AutoPlugins 的行为,并且, 不管怎样,它在 sbt 1.x 中已经消失了(出于上述原因,我敢打赌)

AutoPlugins 不应覆盖项目中的设置。项目应该始终对自己的设置拥有最终决定权,这是有道理的。

您可以使用+= 而不是:=(在项目中的插件中)轻松完成scalacOptions 部分。一般来说,您几乎不应该将:= 与Seq-settings 一起使用,尤其是scalacOptions

override def projectSettings = Seq(
    scalacOptions += "-Yrangepos"
)

对于scalaVersion,好吧,如果项目明确设置了scalaVersion,那么您的AutoPlugin 无法推翻它。它不应该能够。但是,如果项目没有在项目级别定义scalaVersion(但可能在in ThisBuild 级别,例如),您可以获得您想要的效果。

【讨论】:

感谢您的回答,很高兴知道它无法完成,我现在可以停止打脸了。但是,有没有什么方法可以在不直接编辑项目的.sbt文件的情况下达到同样的效果呢?

以上是关于Sbt autoplugin 覆盖项目设置的主要内容,如果未能解决你的问题,请参考以下文章

SBT:多构建依赖/聚合项目中的覆盖设置

使用 sbt-projectmatrix 创建 AutoPlugin。如何设置scalaVersion?

如何在具有多个子项目的 SBT 项目中覆盖子项目中的设置

SBT AutoPlugin 缺少添加的工件

无法从 AutoPlugin 的命令运行自定义 sbt 任务

需要从我在我的 sbt 插件中使用的插件中提供一个 SettingKey