我有一个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
可用?我试过跟this示例无效。
我的最终目标是使用像blog post这样定义的任务,但我想至少先让一些简单的例子工作。在这种情况下,我会在build.sbt中添加类似registerTask("testTask", "com.example.tasks.Test", "Run a test task")
的内容,但是我遇到与上面相同的问题。
答案 0 :(得分:1)
首先,您应该将您的任务定义放在插件的源中,而不是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..