home

Scala Mill Worked Example

2018-05-03

Earlier this year Mill, a new Scala build tool, was released. It seemed pretty nifty - SBT has been very heavyweight and tends to be slow.

I'm looking at using Scala for a home project, and I came up with this Mill build definition. I think it'll prove useful to others.

Note that I've tuned it for an essentially "industrial" level of code cleanliness - WartRemover, tons of compile errors, etc.

Comments or improvements on this are, of course, appreciated - paul@nathan.house .

// -*- mode: Scala; -*-  
 
import mill._  
import mill.scalalib._  
import coursier.maven.MavenRepository  
 
 
 
object project extends ScalaModule {  
  def scalaVersion = "2.12.6"  
 
  def repositories = super.repositories ++ Seq(  
    MavenRepository("https://oss.sonatype.org/content/repositories/releases")  
  )  
 
  def ivyDeps = Agg(  
    ivy"com.sparkjava:spark-core:2.7.2",  
    ivy"io.circe::circe-core:0.9.3",  
    ivy"io.circe::circe-generic:0.9.3",  
    ivy"io.circe::circe-parser:0.9.3")  
 
  // Keep this code sparkly clean with the POWER OF TYPES.  
  def compileIvyDeps = Agg(ivy"org.wartremover::wartremover:2.2.1")  
  def scalacPluginIvyDeps = Agg(ivy"org.wartremover::wartremover:2.2.1")  
 
 
  def mainClass = Some("History.History")  
 
  // Mostly mooched from https://tpolecat.github.io/2017/04/25/scalac-flags.html  
  def scalacOptions = Seq(  
    // Wart remover!  
    "-P:wartremover:traverser:org.wartremover.warts.Unsafe",  
    "-P:wartremover:traverser:org.wartremover.warts.PublicInference",  
    "-deprecation",                      // Emit warning and location for usages of deprecated APIs.  
    "-encoding", "utf-8",                // Specify character encoding used by source files.  
    "-explaintypes",                     // Explain type errors in more detail.  
    "-feature",                          // Emit warning and location for usages of features that should be imported explicitly.  
    "-language:existentials",            // Existential types (besides wildcard types) can be written and inferred  
    "-language:experimental.macros",     // Allow macro definition (besides implementation and application)  
    "-language:higherKinds",             // Allow higher-kinded types  
    "-language:implicitConversions",     // Allow definition of implicit functions called views  
    "-unchecked",                        // Enable additional warnings where generated code depends on assumptions.  
    "-Xcheckinit",                       // Wrap field accessors to throw an exception on uninitialized access.  
    "-Xfatal-warnings",                  // Fail the compilation if there are any warnings.  
    "-Xfuture",                          // Turn on future language features.  
    "-Xlint:adapted-args",               // Warn if an argument list is modified to match the receiver.  
    "-Xlint:by-name-right-associative",  // By-name parameter of right associative operator.  
    "-Xlint:constant",                   // Evaluation of a constant arithmetic expression results in an error.  
    "-Xlint:delayedinit-select",         // Selecting member of DelayedInit.  
    "-Xlint:doc-detached",               // A Scaladoc comment appears to be detached from its element.  
    "-Xlint:inaccessible",               // Warn about inaccessible types in method signatures.  
    "-Xlint:infer-any",                  // Warn when a type argument is inferred to be `Any`.  
    "-Xlint:missing-interpolator",       // A string literal appears to be missing an interpolator id.  
    "-Xlint:nullary-override",           // Warn when non-nullary `def f()' overrides nullary `def f'.  
    "-Xlint:nullary-unit",               // Warn when nullary methods return Unit.  
    "-Xlint:option-implicit",            // Option.apply used implicit view.  
    "-Xlint:package-object-classes",     // Class or object defined in package object.  
    "-Xlint:poly-implicit-overload",     // Parameterized overloaded implicit methods are not visible as view bounds.  
    "-Xlint:private-shadow",             // A private field (or class parameter) shadows a superclass field.  
    "-Xlint:stars-align",                // Pattern sequence wildcard must align with sequence component.  
    "-Xlint:type-parameter-shadow",      // A local type parameter shadows a type already in scope.  
    "-Xlint:unsound-match",              // Pattern match may not be typesafe.  
    "-Yno-adapted-args",                 // Do not adapt an argument list (either by inserting () or creating a tuple) to match the receiver.  
    "-Ypartial-unification",             // Enable partial unification in type constructor inference  
    "-Ywarn-dead-code",                  // Warn when dead code is identified.  
    "-Ywarn-extra-implicit",             // Warn when more than one implicit parameter section is defined.  
    "-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:implicits",           // Warn if an implicit parameter is unused.  
    "-Ywarn-unused:imports",             // Warn if an import selector is not referenced.  
    "-Ywarn-unused:locals",              // Warn if a local definition is unused.  
    "-Ywarn-unused:params",              // Warn if a value parameter is unused.  
    "-Ywarn-unused:patvars",             // Warn if a variable bound in a pattern is unused.  
    "-Ywarn-unused:privates",            // Warn if a private member is unused.  
    "-Ywarn-value-discard"               // Warn when non-Unit expression results are unused.  
  )  
} 

EOF