代码之家  ›  专栏  ›  技术社区  ›  tg44

如何从sbt任务调用从属库函数?

  •  1
  • tg44  · 技术社区  · 10 年前

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

    我想编写一个sbt任务,它可以使用给定的参数从项目目录运行该工具,如 sbt 'enums -rename A B' 。我的工具可以通过sbt依赖项注入到项目中。

    我浏览了一下这本书 sbt in Action 寻找答案,但这些例子并不具体。

    我的体型。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 回复  |  直到 10 年前
        1
  •  2
  •   Olivier Samyn    8 年前

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

    因此,当您需要您的库来定义任务时,该任务是您的构建的依赖项。sbt文件(而不是项目的依赖项)。

    声明生成。sbt文件取决于您的库,只需在项目文件夹中创建一个“.sbt”文件;例子:

    项目/依赖性.sbt

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

    和in 构建.sbt 添加:

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

    一些评论:

    • 小心使用scala版本:因为sbt0.13是用scala2.10编译的;您的库也应该为scala2.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