今までなんとなくでやってきたので、自戒を込めてメモです。
sbtでサブプロジェクトを定義する方法を調べている最中に見つけたものです。
初期状態
sbt
でプロジェクトを作成すると、だいたいこんな構成になります。
app
/project
build.properties
/src
/main
/scala
build.sbt
build.sbt
の中身はこんな感じです。
name := "app"
version := "0.1"
scalaVersion := "2.12.8"
初期だと、アプリ名とバージョン指定するものに見えるので、役割が分かりづらいです。
build.sbtの役割
ビルド定義のルートファイルとしての役割を持ちます。
ビルド定義として記述するのは、おおむねこのようなものになります。
- 参照するライブラリ定義
- 警告やエラーの定義
- 特定のコマンドを拡張
build.sbt
の中に、すべてのプロジェクトのビルド定義を記載することも可能です。
projectディレクトリ
sbtの文書 によれば、
project ディレクトリは、ビルドをビルドする方法を記述したビルドの中のビルドだ。
と記載されています。要するに、ビルド定義を分割して記述できる、ということです。
なお、最初から格納されているbuild.properties
は、ビルドに使うsbtのバージョンを指定します。
参考:sbtバージョンの指定
よくある分割
依存関係のライブラリを管理する場合、Dependencies.scala
という名前が良く使われるようです。
sbtのページで紹介されている
sbt new sbt/scala-seed.g8
コマンドで作成できるプロジェクトでは、以下のように定義されています。
import sbt._
object Dependencies {
lazy val scalaTest = "org.scalatest" %% "scalatest" % "3.0.5"
}
そして、build.sbtはこのように記述されています。
import Dependencies._
ThisBuild / scalaVersion := "2.12.8"
ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / organization := "com.example"
ThisBuild / organizationName := "example"
lazy val root = (project in file("."))
.settings(
name := "Hello",
libraryDependencies += scalaTest % Test
)
# 以下省略
このように、import Dependencies._
で、project
ディレクトリ配下のファイルを参照できます。
ファイル名など
慣例的に、依存ファイルの管理にはDependencies.scala
というファイルが使われるようです。ただ、sbtの仕様としては、
ファイル名は何でもよい
となっています。project
ディレクトリ以下に、拡張子が.scala
または.sbt
のファイルが格納されていればよい、と記載されています。
ファイル分割が必要なケース
build.sbt において、トップレベルで object や class を定義することはできない。 それらが必要なら project/ 配下にScala ソースファイル (.scala) を置くべきだろう。
とのことです。どうしてもclassが必要な場合、というのが、私には思いつかないです。いろいろなプロジェクト調べてみると、何かわかるかもしれません。
とはいえ、
また .scala ファイルを使うかどうかの判断には、君や君のチームがどれくらい Scala に慣れているかということも関係するだろう。
という記述もあるので、慣れるまでは無理に使わないほうが良いのだろうと思います。
sbtの文書を読まないと、と思い始めたあたりが、使い始める良い頃合いなのかもしれません。