author: fujohnwang
To draft a SBT 0.10+ plugin, TWO parts should be taken into consideration:
the build file of the plugin;
the source code file or the definition files of the plugin;
sbtPlugin := true name := "aspectj_sbt_plugin" version := "0.0.1" organization := "name.fujohnwang" publishMavenStyle := true scalacOptions := Seq("-deprecation", "-unchecked") resolvers += "Typesafe Repo" at "http://repo.typesafe.com/typesafe/releases/" libraryDependencies ++= Seq("org.aspectj" % "aspectjtools" % "1.6.11.RELEASE", "org.aspectj" % "aspectjrt" % "1.6.11.RELEASE","org.aspectj" % "aspectjweaver" % "1.6.11.RELEASE")
import sbt._
import Keys._
object MyPlugin extends Plugin {
val MyConfiguration = config("myconf")
val mySetting = SettingKey[String]("my-setting")
val myTask = TaskKey[Unit]("my-task", "task description")
override lazy val settings = inConfig(MyConfiguration)(Seq(
:= "initial value for my-setting",
mySetting
<<= (streams, mySetting, …) map{
myTask
(s, ms, …)=>
// do what u want to do with the arguments
},
// other settings
))
}
Note: U refer to each setting via their key and refer to their values via map from key.
in your project, 2 places should be taken care about:
1- the “project/plugins.sbt”resolvers += yourResolver // help sbt to find out where your plugin is addSbtPlugin("name.fujohnwang" % "aspectj_sbt_plugin" % "0.0.1") // declare to use your plugin
2- build.sbt under the root path of your project(light configuration) or project/Build.scala(full configuration)
usually, you can customize the settings of the plugin or add necessary dependencies in your build file(s), this is variable as per your usage scenarios. If default values are ok for you, nothing about plugin is needed to add to your build file.
1- declare custom Configuration to enhance the modularity;
2- declare necessary SettingKey(s) to make your plugin flexible(which allows your users to customize the plugin)
3- each Keys(Setting or Task) can be initialized or implemented by <<= with other Key(s)