如何(自动)从 sbt 插件继承设置/任务



我有一个 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..

最新更新