使用 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?的主要内容,如果未能解决你的问题,请参考以下文章

创建和使用复合数组

Linux 使用 touch 命令创建文件

Linux 使用 mkdir 命令创建目录

python多线程创建与使用(转)

在js中使用createElement创建HTML对象和元素

使用IDEA创建package