addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.9.0")
For .sbt build definitions, inject the plugin settings in build.sbt:
webSettings
class FooBarBazController
class UrlMappings {
static mappings = {
"/"(resources: 'fooBarBaz')
}
}
In the build.sbt, I can assign values for certain predefined attributes.
I can compile my project by typing sbt compile, and test it by typing sbt test.
I can add plugins by copy-pasting cryptic code from its README.
Setting
sSetting[T]
describes a transformation of the build descriptionKey | Value |
---|---|
name | "sbt-example-project" |
libraryDependencies | List(org.scala-lang:scala-library:2.10.4) |
console | Defaults.consoleTask |
Key | Value |
---|---|
name | "Case Nightmare Green" |
libraryDependencies | List(org.scala-lang:scala-library:2.10.4) |
console | Defaults.consoleTask |
sealed abstract class SettingKey[T] {
final def := (v: T): Setting[T] = ???
final def +=[U](v: U)
(implicit a: Append.Value[T, U]): Setting[T] = ???
final def ++=[U](vs: U)
(implicit a: Append.Values[T, U]): Setting[T] = ???
}
description :=
s"${name.value}, kindly provided by ${organizationName.value}"
session list
shows a log of our SBT sessionsession save
saves it to the build.sbt fileSeq[Setting[_]]
~
TaskKey[T]
returns Setting[Task[T]]
lazy val domain = project
lazy val infrastructure = project.dependsOn(domain).settings(
libraryDependencies +=
"com.typesafe" %% "akka-actor" % "2.3.3"
)
version in ThisBuild := "0.1.0-SNAPSHOT"
organization.in(ThisBuild).:=("uk.co.laundry")
Use projectName/key
to
access setting scoped by project.
logLevel in Compile := Level.Info
logLevel in Test := Level.Warn
Use configName:key
to
access setting scoped by Ivy configuration
initialCommands += """
import scala.concurrent.duration._
import scala.concurrent.Future
"""
initialCommands in console += """
import co.uk.laundry.domain._
"""
Use taskName::key
to
access setting scoped by task.
object ReleaseNotesKeys {
lazy val releaseNotesDir =
settingKey[File]("...")
lazy val releaseNotesFileName =
settingKey[Release => String]("...")
lazy val releaseNotesTemplate =
settingKey[ReleaseNotes => String]("...")
}
object Defaults {
def dir: Setting[File] =
releaseNotesDir := target.value / "release-notes"
def fileName: Setting[Release => String] =
releaseNotesFileName := { release =>
s"${normalizedName.value}-${release.version}.md"
}
}
sbt.RichFile
object ReleaseNotesKeys {
lazy val releaseNotesReleases = taskKey[List[Release]]("...")
lazy val generateReleaseNotes = inputKey[ReleaseNotes]("...")
lazy val dumpReleaseNotes = inputKey[File]("...")
}
val releaseParser: Parser[(Release, Option[Release])] = {
val releases = Implementation.releases
val tags = releases map (_.gitTag)
val parser = StringBasic
.examples(tags.toSet, check = true)
Space ~> parser map { releaseTag =>
releases.dropWhile(_.gitTag != releaseTag) match {
case head :: tail => (head, tail.headOption)
case _ => sys.error("No release to generate release notes for")
}
}
}
generateReleaseNotes := {
val (release, prevRelease) =
Implementation.releaseParser.parsed
Implementation.releaseNotes(prevRelease, release)
val contribs: Stream[Contributor] =
Process(s"git shortlog -sne $prev${release.gitTag}")
.lines collect {
case GitContributor(c) => c
}
dumpReleaseNotes := {
val releaseNotes =
ReleaseNotesKeys.generateReleaseNotes.evaluated
val fileName =
releaseNotesFileName.value(releaseNotes.release)
val outputFile = releaseNotesDir.value / fileName
IO.write(
outputFile, releaseNotesTemplate.value(releaseNotes))
outputFile
}
name := "sbt-release-notes"
organization := "com.hipstercoffee"
sbtPlugin := true
In a .sbt file in your project directory:
addSbtPlugin(
"com.hipstercoffee" % "sbt-release-notes" % "0.1.0)
object ReleaseNotesPlugin extends AutoPlugin {
override def projectSettings: Seq[Def.Setting[_]] =
ReleaseNotes.releaseNotesSettings
}
lazy val root = project
.in(file("."))
.enablePlugins(releasenotes.ReleaseNotesPlugin)
object ReleaseNotesPlugin extends AutoPlugin {
override def projectSettings: Seq[Def.Setting[_]] =
ReleaseNotes.releaseNotesSettings
override def trigger = allRequirements
}