1. カスタム依存関係設定を定義する方法

カスタム依存関係設定を定義する方法 

依存関係設定(または単に_設定_)は、独自のクラスパス、ソース、生成されたパッケージなどを備えた、ライブラリ依存関係のグラフを定義します。依存関係設定の概念は、sbt がかつて管理された依存関係に使用していた Ivy [ライブラリの依存関係][Library-Dependencies] と、[Maven スコープ](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 など) を導入する場合にのみ検討してください。

一般的に、キーの名前空間として単に設定を導入することはお勧めできません。

カスタム設定の欠点の 1 つは、スコープに関する複雑さについてユーザーが混乱する可能性があることです。 サブプロジェクトとタスクには精通しているかもしれませんが、設定スコープが関係すると複雑になります。

もう 1 つの欠点は、sbt からのサポートが限られていることです。 たとえば、設定が別の設定を `extend` することを意図していることを表現できますが、設定の継承はありません。 予期されるすべて設定とタスクを提供する必要があります。 つまり、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",
  )

サンドボックス設定の例 

設定で役立つ場合がある手法の 1 つは、ユーザーのプロジェクトにサイドグラフを追加して、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 を有効にすると、CLI を実行する `scalafmt` タスクが追加されます。

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

テスト設定を追加するにはどうすればよいですか? 

[テスト] の [追加のテスト設定] セクションを参照してください。[Testing.html](Testing.html)