2016-09-26 43 views
1

我爲我的sbt項目編寫了自定義任務並將其放置在build.sbt中。 但是我想把任務的代碼分開文件並從build.sbt中導入。我創建mytask.sbt包含這樣的事情:如何從build.sbt中分離任務代碼

lazy val myTask = taskKey[Unit]("my task") 

myTask := { 
    //doing task 
} 

,但我不知道我怎麼能導入此任務從內部build.sbt所以我可以使用這樣的事情:

compile <<= (compile in Compile) dependsOn myTask 

我意識到有插件的概念,但我認爲這是對我的需求矯枉過正。我只想分開一些代碼。

+0

我刪除了我的答案,因爲它實際上並沒有回答你問題中有趣的部分......我試圖讓它與任務定義一起工作,但現在我的頭痛了。 –

回答

2

你沒有提到你正在使用什麼樣的版本,所以下面的答案是基於版本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成爲您項目中的常見構建任務。

+0

我想你的意思是「在scala文件中定義任務的邏輯」而不是sbt文件。無論如何謝謝你的回答,它對我來說工作得很好。 – Vistritium

+0

很高興在這裏它幫助。感謝您的更正,現在已經修復。 –

相關問題