你沒有提到你正在使用什麼樣的版本,所以下面的答案是基於版本0.13.12。
據我所知,任務必須在sbt文件中,插件中或擴展Build特徵的scala文件對象中定義。 我不認爲它可能定義一個SBT文件進行任何操作,並用它在另一個,所以從我的角度來看,您有以下選擇:
擴展構建特性 做事的這種方式,在sbt的後續版本中已經被棄用了,所以我不會進入那個版本。
在scala文件中定義任務的邏輯。 您可以將任務的聲明和邏輯分開,以便在sbt構建文件中聲明任務,但將其邏輯移至scala文件中。然後生成文件可能是這樣的:
import CommonBuildCode._
val myTask = taskKey[Unit]("my task")
myTask := {
myTaskPerform()
}
compile := {
myTask.value
(compile in Compile).value
}
而且你的邏輯的任務可能是在文件的項目/ CommonBuildCode.scala
import sbt._
object CommonBuildCode {
def myTaskPerform(): Unit = {
println("-------------------------- myTask called --------------------------")
}
}
我不知道這將是足以讓你的,但它會將您的build.sbt文件中有關myTask任務的行數保持最小。
創建一個簡單的插件 它很容易創建SBT一個插件,這將產生非常接近你的要求的結果。首先創建文件的項目/ MyTaskPlugin.scala這樣的:
import sbt._
object MyTaskPlugin extends AutoPlugin {
object autoImport {
val myTask = taskKey[Unit]("my task")
}
import autoImport._
override def projectSettings = Seq(
myTask := {
println("--------------- myTask called from a plugin------------------")
}
)
}
當項目啓動時,項目AUTOIMPORT下任何東西會被自動導入,可在您的SBT構建文件使用,並在設定的所有設置projectSettings方法將應用。所以,現在你需要在你做build.sbt文件的唯一事情,就是激活插件:
使用插件的一個額外的好處是,它會很容易插件重構到其自己的項目,在那裏它可以發佈一個罐子,這將很容易被其他項目激活。這可能會非常方便,以防myTask成爲您項目中的常見構建任務。
我刪除了我的答案,因爲它實際上並沒有回答你問題中有趣的部分......我試圖讓它與任務定義一起工作,但現在我的頭痛了。 –