【问题标题】:Sbt autoplugin to override project settingsSbt autoplugin 覆盖项目设置
【发布时间】: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!")
}

感谢任何帮助。

【问题讨论】:

    标签: scala plugins sbt


    【解决方案1】:

    你真的不想使用addSettings,因为

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

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

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

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

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

    【讨论】:

    • 感谢您的回答,很高兴知道它无法完成,我现在可以停止打脸了。但是,有没有什么方法可以在不直接编辑项目的.sbt文件的情况下达到同样的效果呢?
    猜你喜欢
    • 2019-01-23
    • 2019-04-02
    • 2021-10-31
    • 2014-12-16
    • 2017-04-18
    • 2011-03-01
    • 2021-11-20
    • 2020-06-08
    • 2015-09-25
    相关资源
    最近更新 更多