我有一个 sbt 插件,定义了我希望在 Play 项目或其他一般 sbt 项目中可用的任务。虽然这可能不是最佳实践,但我更愿意在 Play 项目中自动提供这些任务,这样我需要做的就是通过 plugins.sbt 添加 sbt 插件。但在我走那么远之前,我根本无法导入任务。
如果插件的 build.sbt 如下所示:
name := "sbt-task-test"
version := "1.0.0-SNAPSHOT"
scalaVersion := "2.10.3"
scalaBinaryVersion := "2.10"
organization := "com.example"
sbtPlugin := true
lazy val testTask = taskKey[Unit]("Run a test task.")
testTask := {
println("Running test task..")
}
如何在另一个 sbt 项目的 build.sbt 或 Build.scala 中提供testTask
?我尝试按照这个例子无济于事。
我的最终目标是使用本博客文章中定义的任务,但我想至少先获得一些更简单的示例。在这种情况下,我会在build.sbt中添加类似registerTask("testTask", "com.example.tasks.Test", "Run a test task")
的东西,但是我遇到了与上述相同的问题。
首先,您应该将任务定义放在插件的源代码中,而不是build.sbt
中。所以试试这个:
-
插件的
build.sbt
(它只定义了如何构建插件):name := "sbt-task-test" version := "1.0.0-SNAPSHOT" scalaVersion := "2.10.3" // scalaBinaryVersion := "2.10" // better not to play with this organization := "com.example" sbtPlugin := true
-
src/main/scala/MyPlugin.scala
(在插件项目中)import sbt._ object MyPlugin extends Plugin { lazy val testTask = taskKey[Unit]("Run a test task.") override def settings = Seq( testTask := { println("Running test task..") } ) }
重写设置有助于将此任务的定义添加到项目范围。现在您应该使用 sbt publishLocal
构建和发布插件(例如本地)。
然后在项目中,您要使用此插件的位置:
-
project/plugins.sbt
应包含:addSbtPlugin("com.example" % "sbt-task-test" % "1.0.0-SNAPSHOT")
这将自动将testTask
键和定义添加到范围中,以便您可以在项目的目录中执行以下操作:
sbt testTask
它会打印Running test task..