1. 如何定义自定义依赖项配置

如何定义自定义依赖项配置 

依赖项配置(简称配置)定义了一个库依赖项图,可能包含自己的类路径、源代码、生成的包等。依赖项配置的概念来自 Ivy,sbt 曾经使用它来管理依赖项 [库依赖项][Library-Dependencies],以及来自 [MavenScopes](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope)。

您在 sbt 中会看到的一些配置

  • Compile,它定义了主构建(src/main/scala)。
  • Test,它定义了如何构建测试(src/test/scala)。
  • Runtime,它定义了run 任务的类路径。

自定义依赖项配置的注意事项 

自定义配置应仅在您引入新的源代码集或其自己的库依赖项(如Test)时考虑。

通常,仅仅为了命名空间键而引入配置是一个不好的主意。

自定义配置的一个缺点是,用户会对围绕范围的复杂性感到困惑。他们可能熟悉子项目和任务,但在涉及配置范围时,情况会变得复杂。

另一个缺点是 sbt 的支持有限。例如,您可以表达一个配置应该扩展另一个配置,但没有设置继承。您必须提供所有预期设置和任务。这意味着当 sbt 添加新功能时,自定义配置很有可能不会被覆盖。第三方插件也是如此。

基本自定义配置示例 

以下是一个最小自定义配置的示例。

project/FuzzPlugin.scala 

package com.example.sbtfuzz

import sbt._

object FuzzPlugin extends AutoPlugin {
  object autoImport {
    lazy val Fuzz = config("fuzz")
  }
  import autoImport._
  override lazy val projectSettings =
    inConfig(Fuzz)(Defaults.configSettings)
}

build.sbt 

ThisBuild / scalaVersion     := "2.13.4"
ThisBuild / version          := "0.1.0-SNAPSHOT"

lazy val root = (project in file("."))
  .configs(Fuzz)
  .enablePlugins(FuzzPlugin, ScalafmtCliPlugin)
  .settings(
    name := "use",
  )

沙箱配置示例 

使用配置的一个有时有用的技术是为用户项目添加一个侧图,以便 Coursier 下载一些 JAR 文件,您的任务可以调用它们。这被称为沙箱配置。例如,这可以用于调用 Scala 2.13 CLI 版本的 scalafmt。从 sbt 1.4.x 开始,存在一个限制,因此沙箱配置必须使用与用户子项目相同的 Scala 版本。

project/ScalafmtPlugin.scala 

package com.example

import sbt._
import Keys._

object ScalafmtCliPlugin extends AutoPlugin {
  object autoImport {
    lazy val ScalafmtSandbox = config("scalafmt").hide
    lazy val scalafmt = inputKey[Unit]("")
  }
  import autoImport._
  override lazy val projectSettings = Seq(
    ivyConfigurations += ScalafmtSandbox,
    libraryDependencies += "org.scalameta" %% "scalafmt-cli" % "2.7.5" % ScalafmtSandbox,
    scalafmt := (ScalafmtSandbox / run).evaluated
  ) ++ inConfig(ScalafmtSandbox)(
    Seq(
      run := Defaults.runTask(managedClasspath, run / mainClass, run / runner)
        .evaluated,
      managedClasspath := Classpaths.managedJars(
        ScalafmtSandbox,
        classpathTypes.value,
        update.value,
      )
    ) ++
      inTask(run)(
        Seq(
          mainClass := Some("org.scalafmt.cli.Cli"),
          fork := true, // to avoid exit
        ) ++ Defaults.runnerSettings
      )
  )
}

启用ScalafmtPlugin 将添加scalafmt 任务,该任务运行 CLI。

sbt:custom-configs> scalafmt --version
[info] running (fork) org.scalafmt.cli.Cli --version
[info] scalafmt 2.7.5
[success] Total time: 3 s, completed Feb 8, 2021 12:01:34 AM
sbt:custom-configs> scalafmt
[info] running (fork) org.scalafmt.cli.Cli
[info] Reformatting...
       Reformatting...
[success] Total time: 6 s, completed Feb 8, 2021 12:01:40 AM

如何添加测试配置? 

请参阅 测试 中的 附加测试配置 部分。