【问题标题】:How do I call a dependent library function from an sbt task?如何从 sbt 任务调用依赖库函数?
【发布时间】:2016-05-14 04:03:21
【问题描述】:

我有一个用 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 可以处理这种类型的任务/依赖结构,还是我需要以另一种方式处理?

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    SBT 是递归的:它编译项目文件夹下的 .sbt 文件和 .scala 文件并使用它们来执行您的构建(实际上您可以将 sbt 视为一个帮助您生成构建的库)。

    因此,由于您需要您的库来定义一项任务,因此该任务是您的 build.sbt 文件的依赖项(而不是您的项目的依赖项)。

    要声明 build.sbt 文件依赖于您的库,只需在项目文件夹中创建一个“.sbt”文件即可;示例:

    project/dependencies.sbt

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

    并在 build.sbt 中添加:

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

    一些cmets:

    • 小心使用的 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 方法)。因此,参数应该是StringArray(此处为空),它返回Unit(java 中为void)。

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

    【讨论】:

    • 我会试试这个,但我认为这会像我想象的那样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2015-12-04
    • 2015-08-26
    • 1970-01-01
    • 2015-07-11
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多