如何从某个sbt任务调用依赖库函数?

时间:2016-02-04 13:49:47

标签: scala sbt

我有一个用Java编写的CLI工具,它可以使用添加的参数修改某些源代码。例如,它可以在整个项目中重命名枚举值。

我想编写一个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 个答案:

答案 0 :(得分: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 main方法(或scala等价物)。所以,参数应该是Array String(这里是空的),它返回Unit(在java中为void)。

有些参考了解解决方案: http://www.scala-sbt.org/0.13/docs/Organizing-Build.html