如何在编译后调用我们自己的.class后处理器?

时间:2014-06-05 17:29:10

标签: sbt

我的公司正在从ant切换到sbt,以便将Scala集成到我们庞大的Java现有代码中(如果你问我,那就是智能移动)。 在编译之后,我们通常使用我们自己的工具对所有生成的.class进行后处理,这是编译的结果。

我一直试图在sbt做同样的事情,看起来比预期更复杂。 我试过了:

  • 使用fullRunTask调用我们的后处理器。工作正常但我们想传递“products.value”来查找.class文件但它不起作用

  • 另一个甚至更好的解决方案是扩展编译(在编译中编译〜= {result => ...)。但我没有找到“result =>”之后的代码可以调用我们的后处理器

  • 我们正在寻找其他解决方案:多个项目,一个用于后处理器,一个用于其余代码,这样可以清理,但由于源代码纠缠在一起,这并不像看起来那么容易(并且我们仍然会有第一个问题)

有任何帮助吗?

2 个答案:

答案 0 :(得分:0)

我只想编写一个在其他阶段之后运行的简单插件。它可以检查所有.class文件的目标文件夹。

然后,您可以在构建服务器中执行类似sbt clean compile myplugin的操作。

这是proguard插件[1]采用的方法。您可以将其作为起点。

[1] https://github.com/sbt/sbt-proguard

答案 1 :(得分:0)

最后,我在阅读“SBT in Action”和其他文档后找到了解决方案。这很简单,但理解SBT不是(至少对我而言)。

   name := "Foo"

   version := "1.0"

   scalaVersion := "2.11.0"

   fork := true

   lazy val foo = TaskKey[Unit]("foo")

   val dynamic = Def.taskDyn {
    val classDir = (classDirectory in Compile).value
    val command = " Foo "+classDir
    (runMain in Compile).toTask(command)
   }

   foo := {
    dynamic.value
   }

   foo <<= foo triggeredBy(compile in Compile)

示例项目包含一个带有主函数

的Foo.scala