【Scala】SBT ~ 入門編 ~

■ はじめに

 Scala を初めて、SBTについて今まで何となくやっていたが
ちゃんと勉強しないとまずいと感じたので、メモ。

目次

【0】環境設定
【1】ビルドツール「sbt」
 1)主な機能
 2)sbt の処理の流れ
【2】フォルダ構成
 1)build.sbt
 2)build.properties
 3)plugins.sbt
【3】定義ファイル種類
 1)マルチプロジェクト .sbtビルド定義ファイル
 2)bare .sbtビルド定義ファイル
【4】タスク
 1)タスク追加

【0】環境設定

* 以下の関連記事を参照のこと

Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805

【1】ビルドツール「sbt」

* Scala の ビルドツール
 => Simple Build Tool (Scala Build Toolじゃなかった)
 => JavaのMaven、Ant、Gradleに相当するツール

1)主な機能

[1] ビルド
[2] プロジェクト作成
[3] 依存関係解決

2)sbt の処理の流れ

[1] sbt自身とその依存ライブラリをダウンロードし、ロードする
[2] project配下の設定ファイルで指定されたsbtプラグインがあれば
 ダウンロードしてロードする
[3] ビルド設定ファイルをScalaコードとしてコンパイル
[4] 必要なライブラリ類をダウンロードしてScalaのコンパイルを実行
[5] 依存ライブラリをダウンロードしてScalaのコンパイル時に
 クラスパスに追加できる状態にする

【2】フォルダ構成

├─build.sbt ... ビルド定義ファイル
├─project
│  ├─build.properties ... sbtバージョン設定
│  └─plugins.sbt ... sbtプラグインの設定
└─src
       ├─main ... メインコード
       └─test ... テストコード

1)build.sbt

* ビルド定義ファイル
 => 「プロジェクト」を定義するもの

2)build.properties

* sbtバージョン設定

サンプル
https://github.com/jhole89/aws-glue-sbt-quickstart/blob/master/project/build.properties

sbt.version = 1.2.8

3)plugins.sbt

* sbtプラグインの設定

サンプル
https://github.com/jhole89/aws-glue-sbt-quickstart/blob/master/project/plugins.sbt

addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.2.1")
addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "1.0.0")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.5")

【3】定義ファイル種類

* 以下の2通りある。

1)マルチプロジェクト .sbtビルド定義ファイル
2)bare .sbtビルド定義ファイル

1)マルチプロジェクト .sbtビルド定義ファイル

* 通常は、1)で書く
 => とはいえ、2) の書き方もネットでは多い、、、

https://www.scala-sbt.org/1.x/docs/ja/Multi-Project.html

// [変数] = ( Project ).settings( ... 設定内容 ... )
lazy val root = (project in file(".")).
  settings(
    name := "project-name",
    version := "1.0",
    scalaVersion := "2.12.8",
    libraryDependencies ++= dervy,
    testTasks in Test := {},
    assemblySettings,
    test in assembly := {}
  )

2)bare .sbtビルド定義ファイル

* 単一プロジェクトのビルドしか行うことができない

https://www.scala-sbt.org/1.x/docs/ja/Bare-Def.html

【4】タスク

* SBTで呼び出し、実行できる処理の単位。
 => 「sbt run」「sbt compile」の場合、
  タスクはそれぞれ「run」「compile」になる

https://www.scala-sbt.org/1.x/docs/Tasks.html

1)タスク追加

// ★ここに注目★ 「タスクキー」(他には「セッティングキー」「インプットキー」がある)
val sampleTask = taskKey[Unit]("sample task...")

lazy val root = (project in file(".")).
  settings(
    name := "project-name",
    version := "1.0",
    // ★ここに注目★
    sampleTask := {
      println()
      println("*********************")
      println(s"Hello, world!! ${name.value} - ${version.value}")
      println("*********************")
      println()
    }
  )

コマンド例および出力例

$ sbt sampleTask

・・・略・・・
[info] set current project to project-name (in build file:/C:/work/scala/codes/HelloWorld/sample/)

*********************
Hello, world!! project-name - 1.0
*********************

[success] Total time: 0 s, completed 2023/05/16 23:08:15

関連記事

SBT ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2024/01/13/002637
SBT ~ 基本編 / build.sbt ~
https://dk521123.hatenablog.com/entry/2023/01/27/000000
SBT ~ 基本編 / sbtコマンド ~
https://dk521123.hatenablog.com/entry/2023/01/26/000000
SBT ~ sbtプラグイン
https://dk521123.hatenablog.com/entry/2023/01/25/000000
SBT ~ JAR作成/実行 ~
https://dk521123.hatenablog.com/entry/2023/10/12/200450
SBT ~ 引数設定の仕方 ~
https://dk521123.hatenablog.com/entry/2023/08/21/000000
SBT ~ 設定の切替 ~
https://dk521123.hatenablog.com/entry/2023/08/28/165323
SBT ~ リポジトリ先を変更・追加するには ~
https://dk521123.hatenablog.com/entry/2024/01/12/191252
SBT ~ Proxy環境下でSBTを使用する ~
https://dk521123.hatenablog.com/entry/2023/11/23/000000
SBTでのエラー/警告対応
https://dk521123.hatenablog.com/entry/2023/04/06/093458
Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala ~ 基本編 / Option型 ~
https://dk521123.hatenablog.com/entry/2023/03/09/000000
Scala ~ 基本編 / メソッド ~
https://dk521123.hatenablog.com/entry/2023/03/03/000000
Scala ~ 基本編 / クラス ~
https://dk521123.hatenablog.com/entry/2023/03/14/000857
Scala ~ 基本編 / コレクション ~
https://dk521123.hatenablog.com/entry/2023/03/13/000345
Scala ~ 基本編 / 日付・日時 ~
https://dk521123.hatenablog.com/entry/2023/03/08/000000
Scala ~ 基本編 / 正規表現
https://dk521123.hatenablog.com/entry/2023/03/18/034704
Scala ~ 基本編 / ジェネリック
https://dk521123.hatenablog.com/entry/2023/03/21/003817
Scala ~ ファイル名・パスの扱い ~
https://dk521123.hatenablog.com/entry/2023/03/11/000000
ScalaYAML
https://dk521123.hatenablog.com/entry/2023/03/16/012034
ScalaTest ~ with Coverage ~
https://dk521123.hatenablog.com/entry/2023/08/07/222945
SDKMAN ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/08/13/000000
Spark/Scalaの開発環境構築 ~ Windows編 ~
https://dk521123.hatenablog.com/entry/2023/03/20/115450
AWS CodeArtifact ~ SBTでCodeArtifactを使う ~
https://dk521123.hatenablog.com/entry/2024/01/20/000329
Github Actions ~ Scala Linter ~
https://dk521123.hatenablog.com/entry/2024/04/02/002828