LoginSignup
0
0

More than 1 year has passed since last update.

sbtに再入門したい

Last updated at Posted at 2021-10-17

はじめに

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

sbt

sbt について

sbt は Scala のビルドツールです。
(Scala はJVM系のプログラミング言語です)

sbt は Scala のビルドツールではデファクトスタンダードなものだと思っています。1
他に Scala をビルドする手段としては以下があります。
- Mill を使う
- Java のビルドツール(gradle など)にプラグインを入れてビルドする

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

インストール

インストールには公式サイトからのファイルダウンロードや、パッケージマネージャーによるインストールが可能です。3

mac

sdkman を使う、もしくは homebrew からインストールして使うことができます。

brew install sbt

Windows

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

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

もしくは、ScoopChocolatey といったパッケージマネージャーからもインストールする方法もあります。

Linux

こちらも sdkman からのインストールが可能です。
もしくはパッケージマネージャーからもインストールすることができます。
(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 サブコマンドでサブプロジェクトに入ってからタスクを実行する

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

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

ビルド定義ファイル

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

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

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

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 で「すべてのファイルへのフォーマット」を一括で行いたいので、
以下のような定義を設定しています。

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

sbt plugin

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

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

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

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

参考


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

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

  3. sbt の使用には JDK が必要になるので、別途インストールが必要です。 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0