使用 sbt-projectmatrix 创建 AutoPlugin。如何设置scalaVersion?
Posted
技术标签:
【中文标题】使用 sbt-projectmatrix 创建 AutoPlugin。如何设置scalaVersion?【英文标题】:Use sbt-projectmatrix to create AutoPlugin. How to set scalaVersion? 【发布时间】:2021-11-20 04:11:42 【问题描述】:我使用 sbt-projectmatrix 创建了 2 个带有 customRow 的 sbt 插件:
case class MatrixAxis(
idSuffix: String,
directorySuffix: String
) extends VirtualAxis.WeakAxis
// sbt
val oss = MatrixAxis("-oss", "oss")
val priv = MatrixAxis("-priv", "priv")
val scalaV = ???
lazy val devops = projectMatrix
.enablePlugins(SbtPlugin)
.settings(
pluginCrossBuild / sbtVersion := "1.3.13", // minimum sbt version
).customRow(
scalaVersions = Seq(scalaV),
axisValues = Seq(priv, VirtualAxis.jvm),
_.settings(...)
.customRow(
scalaVersions = Seq(scalaV),
axisValues = Seq(oss, VirtualAxis.jvm),
_.settings(...)
在sbt's guide,他们说:
sbt 插件必须使用 sbt 本身编译的 Scala 2.12.x 进行编译。通过不指定 scalaVersion,sbt 将默认为适合插件的 Scala 版本。
但我不知道如何在不设置 scalaVersions 的情况下创建 customRow?
(如果我设置scalaVersions = Nil
那么projectMatrix 不会为我创建任何项目)
【问题讨论】:
【参考方案1】:sbt-projectmatrix 需要静态知道 Scala 版本,因为它使用它来构建项目的 ID。所以不幸的是,在scalaVersions
参数中,我们无法读取scalaVersion.value
的值来知道sbt 默认会选择什么。
我们能做的就是稍微作弊:首先,使用任何硬编码的 2.12.x 版本(例如 2.12.1)写入scalaVersions
。然后,显式覆盖 scalaVersion := ...
,绕过 sbt-projectmatrix 将设置的 2.12.1:
val oss = MatrixAxis("-oss", "oss")
val priv = MatrixAxis("-priv", "priv")
val scalaV = "2.12.1" // arbitrary 2.12.x version
lazy val devops = projectMatrix
.enablePlugins(SbtPlugin)
.settings(
pluginCrossBuild / sbtVersion := "1.3.13", // minimum sbt version
/* override with the default scalaVersion in the Global scope,
* which is sbt's choice, not impacted by sbt-projectmatrix
*/
scalaVersion := (Global / scalaVersion).value,
).customRow(
scalaVersions = Seq(scalaV),
axisValues = Seq(priv, VirtualAxis.jvm),
_.settings()
)
.customRow(
scalaVersions = Seq(scalaV),
axisValues = Seq(oss, VirtualAxis.jvm),
_.settings()
)
【讨论】:
以上是关于使用 sbt-projectmatrix 创建 AutoPlugin。如何设置scalaVersion?的主要内容,如果未能解决你的问题,请参考以下文章