Simple task DSL for those of us who are lazy

This commit is contained in:
Josh Suereth 2011-09-14 14:16:02 -04:00
parent 8836f37c9c
commit d72d8808cb
3 changed files with 193 additions and 3 deletions

View File

@ -100,7 +100,7 @@ Current -help output:
shows precedence: JAVA_OPTS lowest, command line options highest. shows precedence: JAVA_OPTS lowest, command line options highest.
## Template project # SBT Extra plugin
To gain access to the awesome, simply add the following <project>/project/plugins/project/Build.scala file: To gain access to the awesome, simply add the following <project>/project/plugins/project/Build.scala file:
@ -111,6 +111,9 @@ To gain access to the awesome, simply add the following <project>/project/plugin
lazy val extras = uri("git://github.com/jsuereth/sbt-extras") lazy val extras = uri("git://github.com/jsuereth/sbt-extras")
} }
## Template project
Now to continue the amazement, simply extend the TemplateBuild trait in your project. For example, in your Now to continue the amazement, simply extend the TemplateBuild trait in your project. For example, in your
<project>/project/Build.scala file add: <project>/project/Build.scala file add:
@ -119,4 +122,17 @@ Now to continue the amazement, simply extend the TemplateBuild trait in your pro
object MyAwesomeBuild extends TemplateBuild {} object MyAwesomeBuild extends TemplateBuild {}
The Template build isn't quite finished. There will most likely be a build.sbt DSL variant that does not require a project scala file.
There will most likely be a variant that can be used solely from build.sbt.
## Simple task DSL
SBT extras defines a simplified task DSL for those who are defining simple tasks that do not need to be relied upon, or you are unsure and can refactor later. Once including the sbt-extra-plugin, all you have to do is place the following in your build.sbt to create tasks:
simple_task("zomg") is { println("ZOMG") }
or if you need to depend on other keys:
simple_task("zomg2") on (name, version) is { (n,v) => println("ZOMG " + n + " = " + v + " !!!!!") }
The DSL currently supports between 2 and 9 dependencies. The DSL does not allow defining tasks on different configurations, although this will be added shortly.

View File

@ -5,7 +5,9 @@ import Keys._
import Load.{ BuildStructure, StructureIndex } import Load.{ BuildStructure, StructureIndex }
import scala.collection.{ mutable, immutable } import scala.collection.{ mutable, immutable }
object SbtExtrasPlugin extends Plugin {} object SbtExtrasPlugin extends Plugin {
def simple_task(name: String) = sbt.extra.dsl.SimpleTasks.task(name)
}
trait SbtCreateConfig { trait SbtCreateConfig {
def name: String def name: String

View File

@ -0,0 +1,172 @@
package sbt.extra.dsl
import sbt._
import Scoped._
import Project.{richInitializeTask,richInitialize}
object SimpleTasks {
final def task(name: String) = new TaskId(name)
}
/** Represents the new 'id' of a task to define on a project. */
final class TaskId(name: String) {
/** Creates a Task that has no dependencies. */
final def is[R: Manifest](f: => R) =
TaskKey[R](name) := f
/*final def on[A1](a: ScopedTaskable[A1]): TaskDepend1[A1] =
new TaskDepend1[A1](name, a)*/
final def on[A1, A2](a1: ScopedTaskable[A1], a2: ScopedTaskable[A2]): TaskDepend2[A1, A2] =
new TaskDepend2[A1, A2](name, a1, a2)
final def on[A1, A2, A3](a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3]) =
new TaskDepend3[A1, A2, A3](name, a1, a2, a3)
final def on[A1, A2, A3, A4](a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3],
a4: ScopedTaskable[A4]) =
new TaskDepend4[A1, A2, A3, A4](name, a1, a2, a3, a4)
final def on[A1, A2, A3, A4, A5](a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3],
a4: ScopedTaskable[A4],
a5: ScopedTaskable[A5]) =
new TaskDepend5[A1, A2, A3, A4, A5](name, a1, a2, a3, a4, a5)
final def on[A1, A2, A3, A4, A5, A6](a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3],
a4: ScopedTaskable[A4],
a5: ScopedTaskable[A5],
a6: ScopedTaskable[A6]) =
new TaskDepend6[A1, A2, A3, A4, A5, A6](name, a1, a2, a3, a4, a5, a6)
final def on[A1, A2, A3, A4, A5, A6, A7](a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3],
a4: ScopedTaskable[A4],
a5: ScopedTaskable[A5],
a6: ScopedTaskable[A6],
a7: ScopedTaskable[A7]) =
new TaskDepend7[A1, A2, A3, A4, A5, A6, A7](name, a1, a2, a3, a4, a5, a6, a7)
final def on[A1, A2, A3, A4, A5, A6, A7, A8](a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3],
a4: ScopedTaskable[A4],
a5: ScopedTaskable[A5],
a6: ScopedTaskable[A6],
a7: ScopedTaskable[A7],
a8: ScopedTaskable[A8]) =
new TaskDepend8[A1, A2, A3, A4, A5, A6, A7, A8](name, a1, a2, a3, a4, a5, a6, a7, a8)
final def on[A1, A2, A3, A4, A5, A6, A7, A8, A9](a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3],
a4: ScopedTaskable[A4],
a5: ScopedTaskable[A5],
a6: ScopedTaskable[A6],
a7: ScopedTaskable[A7],
a8: ScopedTaskable[A8],
a9: ScopedTaskable[A9]) =
new TaskDepend9[A1, A2, A3, A4, A5, A6, A7, A8, A9](name, a1, a2, a3, a4, a5, a6, a7, a8, a9)
}
/** Represents a not-yet-defined task that has one dependency */
/*final class TaskDepend1[A1](name: String, a1: ScopedTaskable[A1]) {
final def is[R: Manifest](f: A1 => R): Setting[Task[R]] = {
TaskKey[R](name) <<= a1 map f
}
}*/
/** Represents a not-yet-defined task that has two dependencies */
final class TaskDepend2[A1, A2](name: String,
a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2]) {
final def is[R: Manifest](f: (A1, A2) => R): Setting[Task[R]] = {
TaskKey[R](name) <<= (a1, a2) map f
}
}
/** Represents a not-yet-defined task that has two dependencies */
final class TaskDepend3[A1, A2, A3](name: String,
a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3]) {
final def is[R: Manifest](f: (A1, A2, A3) => R): Setting[Task[R]] = {
TaskKey[R](name) <<= (a1, a2, a3) map f
}
}
/** Represents a not-yet-defined task that has two dependencies */
final class TaskDepend4[A1, A2, A3, A4](name: String,
a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3],
a4: ScopedTaskable[A4]) {
final def is[R: Manifest](f: (A1, A2, A3, A4) => R): Setting[Task[R]] = {
TaskKey[R](name) <<= (a1, a2, a3, a4) map f
}
}
/** Represents a not-yet-defined task that has two dependencies */
final class TaskDepend5[A1, A2, A3, A4, A5](name: String,
a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3],
a4: ScopedTaskable[A4],
a5: ScopedTaskable[A5]) {
final def is[R: Manifest](f: (A1, A2, A3, A4, A5) => R): Setting[Task[R]] = {
TaskKey[R](name) <<= (a1, a2, a3, a4, a5) map f
}
}
/** Represents a not-yet-defined task that has two dependencies */
final class TaskDepend6[A1, A2, A3, A4, A5, A6](name: String,
a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3],
a4: ScopedTaskable[A4],
a5: ScopedTaskable[A5],
a6: ScopedTaskable[A6]) {
final def is[R: Manifest](f: (A1, A2, A3, A4, A5, A6) => R): Setting[Task[R]] = {
TaskKey[R](name) <<= (a1, a2, a3, a4, a5, a6) map f
}
}
/** Represents a not-yet-defined task that has two dependencies */
final class TaskDepend7[A1, A2, A3, A4, A5, A6, A7](name: String,
a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3],
a4: ScopedTaskable[A4],
a5: ScopedTaskable[A5],
a6: ScopedTaskable[A6],
a7: ScopedTaskable[A7]) {
final def is[R: Manifest](f: (A1, A2, A3, A4, A5, A6, A7) => R): Setting[Task[R]] = {
TaskKey[R](name) <<= (a1, a2, a3, a4, a5, a6, a7) map f
}
}
/** Represents a not-yet-defined task that has two dependencies */
final class TaskDepend8[A1, A2, A3, A4, A5, A6, A7, A8](name: String,
a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3],
a4: ScopedTaskable[A4],
a5: ScopedTaskable[A5],
a6: ScopedTaskable[A6],
a7: ScopedTaskable[A7],
a8: ScopedTaskable[A8]) {
final def is[R: Manifest](f: (A1, A2, A3, A4, A5, A6, A7, A8) => R): Setting[Task[R]] = {
TaskKey[R](name) <<= (a1, a2, a3, a4, a5, a6, a7, a8) map f
}
}
/** Represents a not-yet-defined task that has two dependencies */
final class TaskDepend9[A1, A2, A3, A4, A5, A6, A7, A8, A9](name: String,
a1: ScopedTaskable[A1],
a2: ScopedTaskable[A2],
a3: ScopedTaskable[A3],
a4: ScopedTaskable[A4],
a5: ScopedTaskable[A5],
a6: ScopedTaskable[A6],
a7: ScopedTaskable[A7],
a8: ScopedTaskable[A8],
a9: ScopedTaskable[A9]) {
final def is[R: Manifest](f: (A1, A2, A3, A4, A5, A6, A7, A8, A9) => R): Setting[Task[R]] = {
TaskKey[R](name) <<= (a1, a2, a3, a4, a5, a6, a7, a8, a9) map f
}
}