如何开发将从命令行调用的自定义任务(在autoplugin中)?

时间:2014-06-15 21:54:35

标签: sbt

我开始看看sbt插件,我有这个类:

package msbt.test.plugin

import sbt._
import Keys._

object SbtTest extends AutoPlugin {

  object autoImport {
    lazy val hello = taskKey[Unit]("Prints 'Hello World'")
  }

  import autoImport._
  hello := println("hello world")
}

我想从命令行调用该任务。如何将其添加到Build.scala?我无法从那里拿到包裹:

import sbt._
import msbt.test.plugin._ // this cannot be resolved

object SbtGitBuild extends Build {}

当然,如果我手动将其添加到构建文件或build.sbt文件中,它确实有效:

sbtPlugin := true

name := "sbt-test-plugin"

version := "0.1-SNAPSHOT"

scalaVersion := "2.10.4"

lazy val hello = taskKey[Unit]("Prints 'Hello World'")

hello := println("hello world!")

然后从控制台我可以调用hello,但当然我想要的是能够构建我的代码并避免将其扔到构建文件中。这可能吗?我是否需要另一个导入我的插件的sbt项目来测试它?如果是这样,哪种方式最快?

因为我是初学者,所以我编写并测试了每一段代码,有一种快速的方法将更新包含到另一个项目中会很不错。

Here指向Github存储库的链接。

1 个答案:

答案 0 :(得分:2)

您需要将设置放在项目中包含的其中一个设置序列中,例如project/SbtTest.scala

package msbt.test.plugin

import sbt._
import Keys._
import File

object SbtTest extends AutoPlugin {

  object autoImport {
    lazy val hello = taskKey[Unit]("Prints 'Hello World'")
  }

  import autoImport._
  override def projectSettings = Seq(
    hello := println("hello world")
  )
}

此外,您还创建了一个显式启用的自动插件。因此,您还需要在project/build.scala

中启用该插件
import sbt._
import msbt.test.plugin._ // this cannot be resolved

object SbtGitBuild extends Build {
  lazy val root = project.in(file(".")).enablePlugins(SbtTest)
}

您需要覆盖trigger方法

override def trigger = allRequirements

AutoPlugin类的scaladoc非常好,虽然格式错误:

http://www.scala-sbt.org/0.13.5/api/index.html#sbt.AutoPlugin

http://www.scala-sbt.org/0.13.5/sxr/sbt/Plugins.scala.html