sbtに再入門したい


# はじめに
sbt に再入門すべく、sbt に関して思い出した・調べた内容についてをまとめます。
内容についてはバージョン sbt-1.5.5 時点のものとなります。


# sbt
## sbt について
[sbt](https://github.com/sbt/sbt) は Scala のビルドツールです。
（Scala はJVM系のプログラミング言語です）

sbt は Scala のビルドツールではデファクトスタンダードなものだと思っています。[^1]
[^1]: 「思っています」というのは、私が Scala が専門ではないので断言できないためです。Github のレポジトリで使われている具合や、検索した際の情報量を考慮していますが、ここでは流れとしてデファクトスタンダードであるとさせてください。

他に Scala をビルドする手段としては以下があります。
- [Mill](https://github.com/com-lihaoyi/mill) を使う
- Java のビルドツール(gradle など)にプラグインを入れてビルドする

以上のような代替手段があり、それぞれメリット・デメリットはもありますが、
利用者目線からの sbt のもつ良いところは以下のような点だと思います。[^2]
- Scala のビルドツールなのでサポートも厚く、
- OSSを含む多くのプロジェクトで利用されているので知識が豊富、

[^2]: メリット・デメリットについて書かせていただきましたが、他のもすべて優れています。気に入ったのがあれば、それを使うのが良いかと思います。私は sbt が気に入っているので使っています。

## インストール

インストールには公式サイトからのファイルダウンロードや、パッケージマネージャーによるインストールが可能です。[^3]
[^3]: sbt の使用には JDK が必要になるので、別途インストールが必要です。

### mac

[sdkman](https://sdkman.io/) を使う、もしくは [homebrew](https://brew.sh/index_ja) からインストールして使うことができます。

```shell
brew install sbt
```

### Windows

公式サイトからダウンロードすることが可能です。
https://www.scala-sbt.org/download.html

インストーラー（msi）形式、ZIP・TGZ 形式など複数あるのでお好みの方法で設定できます。

もしくは、[Scoop](https://scoop.sh/) や [Chocolatey](https://chocolatey.org/) といったパッケージマネージャーからもインストールする方法もあります。

### Linux

こちらも [sdkman](https://sdkman.io/) からのインストールが可能です。
もしくはパッケージマネージャーからもインストールすることができます。
（RedHat系の rpm や yum、debian/Ubuntu の apt など） 

# 使い方
## sbt の実行
sbt の実行方法について。

sbt を実行するには、以下の方法があります。
- sbt シェルで実行
- バッチモードで実行

sbt シェルで実行するとインタラクティブモードで実行し、
バッチモードは渡したサブコマンドを実行し、結果は標準出力で表示してくれるモードになります。

sbt シェルで実行するには sbt コマンドを引数なしで実行します。
この時に CLI 操作の形で sbt を実行していきます。
バッチモードは sbt コマンド実行時の引数に渡したサブコマンドを実行してくれます。
空白行区切りで複数のサブコマンドを渡すことも可能です。


サブコマンドの実行例は以下のようになります。
- コンパイル: `sbt compile`
- 成果物の削除: `sbt clean`
- テストの実行: `sbt test`
- 特定のテストのみを実行：`sbt "testOnly package.Test"`
- Main の実行: `sbt run`

サブプロジェクトのタスクを実行したい場合は、以下のどちらかを実行します。
- タスクの前にプロジェクト名を指定
- `project` サブコマンドでサブプロジェクトに入ってからタスクを実行する

サブプロジェクトの指定するばあい

```shell
sbt <サブプロジェクト名>/test
```

```shell
sbt "project <サブプロジェクト名>" test
```

## ビルド定義ファイル
sbt によるビルドを実行する際に、ビルド定義ファイルにプロジェクトビルドの設定を定義することができます。
使用する Scala のバージョン、ライブラリの依存関係や ビルド時の設定を定義することができます。

ビルド定義ファイルは `build.sbt` というファイル名でプロジェクトに配置します。

`build.sbt` の設定内容・設定項目は多くなるので今回は省略させてください。
ファイルの実装例としては以下のようなイメージになります。

```scala:build.sbt
name := "sbt15-sample"

version := "0.1"

scalaVersion := "3.0.0"

lazy val root = project
  .in(file("."))
  .settings(
    name              := "main",
    scalaVersion      := "3.0.0",
    semanticdbEnabled := true,
    scalacOptions ++= Seq("-explaintypes", "-Wunused"),
    libraryDependencies ++= Seq(
      // test
      "org.scalatest" %% "scalatest"    % "3.2.9" % Test,
      // mockito
      "org.mockito"    % "mockito-core" % "3.9.0" % Test
    )
  )
```

## コマンドエイリアスの定義

自分で sbt のサブコマンドを定義することも可能です。
`build.sbt` に実行したいコマンドをまとめて、エイリアスコマンドから実行できるように設定できます。

私はフォーマットプラグインの `scalafmt` で「すべてのファイルへのフォーマット」を一括で行いたいので、
以下のような定義を設定しています。

```scala:build.sbt
addCommandAlias(
  "fmt",
  "all scalafmtSbt scalafmt test:scalafmt"
)
```

## sbt plugin

sbt に plugin を設定することができます。
plugin を設定することで、コマンドなどの機能拡張を行うことが可能になります。

`project/plugin.sbt` に追加する plugin を追記し、読み込むことで plugin を使えるようになります。

例えば、Scala のソースファイル、設定ファイル `build.sbt` をフォーマットしてくれる plugin である
`scalafmt` を追加する場合は以下のようになります。

```scala:project/plugin.sbt
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
```


# 参考
- [sbt 公式ドキュメント](https://www.scala-sbt.org/1.x/docs/ja/index.html)
- [sbt Github Repository](https://github.com/sbt/sbt)