Sbt autoplugin覆盖项目设置

时间:2017-10-27 12:11:02

标签: scala plugins sbt

我正在尝试开发一个非常小的autoplugin来覆盖所有项目和子项目的本地配置。具体来说,我希望我的插件能够更改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 个答案:

答案 0 :(得分:0)

你真的不想使用addSettings,因为

  1. 它可能会破坏您构建中所有其他 AutoPlugin的行为,
  2. 无论如何它都在sbt 1.x中消失了(因为上面的原因,我打赌)
  3. AutoPlugin不应该覆盖项目中的设置。项目应始终对自己的设置有最终决定权,这是有道理的。

    您可以使用scalacOptions代替+=轻松执行:=部分(在项目中的插件中)。一般情况下,您几乎不应将:=与Seq设置一起使用,特别是scalacOptions

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

    对于scalaVersion,如果项目明确设置了scalaVersion,则AutoPlugin无法覆盖它。它应该不能。但是,如果项目未在项目级别定义scalaVersion(例如,可能在in ThisBuild级别),则可以获得所需的效果。