Scala のビルドツール sbt では事前に用意したテンプレートからプロジェクトを作成することができます。

$ sbt new scala/scala-seed.g8

公式に用意されている Scala 用のテンプレートの一つに scala/scala-seed.g8 というものがあります。 これは Scala プロジェクトとして最低限の設定を持つテンプレートですが、実際使用するときにはもう少しコンパイルやフォーマットの設定を行ったものがあると嬉しいと感じたため、自分用にテンプレートを作成することにしました。

作成したテンプレートは こちら に置いています。

  1. Project の name, organization 設定
  2. ScalacOptions の設定
  3. Scalafmt の設定

1. Project の name, organization 設定

build.sbt には作成する project の name と organization を定義する場所があるのですが、標準のテンプレートではそこがデフォルトのままになるので、生成時に与えた値を使用するように変更します。

Giter8 テンプレートの作り方 を参考に以下の 2 箇所を変更しました。

  • (1) src/main/g8/default.propertiesorganization を加える
name=My Something Project
organization=com.example // (1)
description=Minimum Scala build.
  • (2) src/main/g8/build.sbt の name, organization に project 生成時に与えた値を設定する
lazy val root = (project in file(".")).
  settings(
    inThisBuild(List(
      organization := "$organization$", // (2)
      scalaVersion := "2.12.2",
      version      := "0.1.0-SNAPSHOT"
    )),
    name := "$name$", // (2)
    scalacOptions := commonScalacOptions,
    libraryDependencies += scalaTest % Test
  )

2. ScalacOptions の設定

  • (1) build.sbtscalacOptions を設定する
    • 各 option の詳細は scalac -help, scalac -X, scalac -Y で確認できる
// (1)
// scalacOptions
// See `scalac -help`, `scalac -X`, or `scalac -Y`
lazy val commonScalacOptions = Seq(
  "-feature" // Emit warning and location for usages of features that should be imported explicitly.
  , "-deprecation" // Emit warning and location for usages of deprecated APIs.
  , "-unchecked" // Enable additional warnings where generated code depends on assumptions.
  , "-encoding" // Specify encoding of source files
  , "UTF-8"
  // , "-Xfatal-warnings"
  , "-language:_"
  , "-Ywarn-adapted-args" // Warn if an argument list is modified to match the receiver
  , "-Ywarn-dead-code" // Warn when dead code is identified.
  , "-Ywarn-inaccessible" // Warn about inaccessible types in method signatures.
  , "-Ywarn-infer-any" // Warn when a type argument is inferred to be `Any`.
  , "-Ywarn-nullary-override" // Warn when non-nullary `def f()' overrides nullary `def f'
  , "-Ywarn-nullary-unit" // Warn when nullary methods return Unit.
  , "-Ywarn-numeric-widen" // Warn when numerics are widened.
  , "-Ywarn-unused" // Warn when local and private vals, vars, defs, and types are unused.
  , "-Ywarn-unused-import" // Warn when imports are unused.
)

lazy val root = (project in file(".")).
  settings(
    inThisBuild(List(
      organization := "$organization$",
      scalaVersion := "2.12.2",
      version      := "0.1.0-SNAPSHOT"
    )),
    name := "$name$",
    scalacOptions := commonScalacOptions,
    libraryDependencies += scalaTest % Test
  )

3. Scalafmt の設定

Scalafmt により Scala コードがフォーマットできるようにしておきます。

これにより sbt scalafmt --test でフォーマットのチェックが、sbt scalafmt で実際にフォーマットをかけられます。

IntelliJ からは別途 plugin をインストールすることで保存時にフォーマットがかかるようにできます。

  • (1) project/plugins.sbt に以下のライブラリ依存を追加
libraryDependencies += "com.geirsson" %% "scalafmt-bootstrap" % "0.6.6"
  • (2) build.sbt に以下の設定を行う
def latestScalafmt = "1.0.0-RC4"
commands += Command.args("scalafmt", "Run scalafmt cli.") {
  case (state, args) =>
    val Right(scalafmt) =
      org.scalafmt.bootstrap.ScalafmtBootstrap.fromVersion(latestScalafmt)
    scalafmt.main("--non-interactive" +: args.toArray)
    state
}
  • (3) .scalafmt.conf にフォーマッティングの設定をする
# For pretty alignment
align = some
# Only format files tracked by git.
project.git = true
# Manually exclude files to format.
project.excludeFilters = ["target/"]