我有一个用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处理这种类型的任务/依赖结构,还是需要以另一种方式执行此操作?
答案 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())
}
一些评论:
tools_2.10
)。新的sbt 1.0是用scala 2.12编译的。%%
符号,因此sbt自己添加了预期的scala版本。Array
String
(这里是空的),它返回Unit
(在java中为void)。有些参考了解解决方案: http://www.scala-sbt.org/0.13/docs/Organizing-Build.html