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

时间:2014-02-23 15:37:16

标签: scala playframework 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可用?我试过跟this示例无效。

我的最终目标是使用像blog post这样定义的任务,但我想至少先让一些简单的例子工作。在这种情况下,我会在build.sbt中添加类似registerTask("testTask", "com.example.tasks.Test", "Run a test task")的内容,但是我遇到与上面相同的问题。

1 个答案:

答案 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..