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
,因为
-
它可能会破坏您构建中所有其他
AutoPlugin
s 的行为,并且,
不管怎样,它在 sbt 1.x 中已经消失了(出于上述原因,我敢打赌)
AutoPlugin
s 不应覆盖项目中的设置。项目应该始终对自己的设置拥有最终决定权,这是有道理的。
您可以使用+=
而不是:=
(在项目中的插件和中)轻松完成scalacOptions
部分。一般来说,您几乎不应该将:=
与Seq-settings 一起使用,尤其是scalacOptions
。
override def projectSettings = Seq(
scalacOptions += "-Yrangepos"
)
对于scalaVersion
,好吧,如果项目明确设置了scalaVersion
,那么您的AutoPlugin
无法推翻它。它不应该能够。但是,如果项目没有在项目级别定义scalaVersion
(但可能在in ThisBuild
级别,例如),您可以获得您想要的效果。
【讨论】:
感谢您的回答,很高兴知道它无法完成,我现在可以停止打脸了。但是,有没有什么方法可以在不直接编辑项目的.sbt
文件的情况下达到同样的效果呢?以上是关于Sbt autoplugin 覆盖项目设置的主要内容,如果未能解决你的问题,请参考以下文章
使用 sbt-projectmatrix 创建 AutoPlugin。如何设置scalaVersion?