2016-02-04 38 views
1

我有一個用Java編寫的CLI工具,它可以用添加的參數修改某些源文件。例如,它可以重命名整個項目的枚舉值。如何從sbt任務調用依賴庫函數?

我想編寫一個sbt任務,可以從我的項目目錄中運行此工具,並使用給定參數運行此工具,如sbt 'enums -rename A B'。我的工具可以通過sbt依賴關係注入到項目中。

我翻閱了本書sbt in Action尋找答案,但這些例子並不具體。

我build.sbt(遠離工作):

name := """toolTestWithActivator""" 

version := "1.0-SNAPSHOT" 

resolvers += "Local Repository" at "file://C:/Users/torcsi/.ivy2/local" 

lazy val root = (project in file(".")).enablePlugins(PlayJava) 

scalaVersion := "2.11.6" 

libraryDependencies ++= Seq(
    "tool" % "tool_2.11" % "1.0", 
    javaJdbc, 
    javaEbean, 
    cache, 
    javaWs 
) 

val mytool = taskKey[String]("mytool") 
mytool := { 
    com.my.tool.Main 
} 

能SBT處理這種類型的任務/依存結構,還是做我需要做的另一種方式?

回答

1

SBT是遞歸的:它在項目文件夾下編譯.sbt文件和.scala文件,並使用它們來執行構建(實際上,您可以將sbt看作可幫助您生成構建的庫)。

因此,當你需要你的庫來定義一個任務時,那個是你的build.sbt文件的依賴(而不是你的項目的依賴)。

要聲明build.sbt文件取決於您的庫,只需在項目文件夾中創建一個「.sbt」文件;例如:

項目/ dependencies.sbt

libraryDependencies += "tool" %% "tool" % "1.0" 

build.sbt地址:

val mytool = taskKey[Unit]("mytool") 
mytool := { 
    com.my.tool.main(Array()) 
} 

一些評論:

  • 要小心使用scala版本:因爲sbt 0.13是用scala 2.10編譯的;你的庫也應該編譯爲scala 2.10(包應該是tools_2.10)。新的sbt 1.0使用scala 2.12進行編譯。
  • 我使用了%%表示法,以便sbt自己添加預期的scala版本。
  • 我假設你的cli工具定義了一個經典的java主要方法(或者相當於scala)。所以,參數應該是StringArray(這裏是空的),它返回Unit(java中的void)。

一些參考,瞭解解決方案: http://www.scala-sbt.org/0.13/docs/Organizing-Build.html

+0

我會嘗試這一點,但我認爲這將作爲我的想象。 – tg44