【问题标题】:How to call our own .class postprocessor after compile?编译后如何调用我们自己的.class后处理器?
【发布时间】:2014-06-07 17:13:27
【问题描述】:

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

我一直在尝试在 sbt 中做同样的事情,但它看起来比预期的要复杂。 我试过了:

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

  • 另一个甚至更好的解决方案是扩展编译(在 Compile ~= { result => ... 中编译)。但是我没有发现“result =>”后面的代码如何调用我们的后处理器

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

有什么帮助吗?

【问题讨论】:

  • 您能否检查一下我对similar question 的回答是否适合您?
  • 谢谢。看起来很有趣。

标签: sbt


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢。这是我考虑过的(因为我需要一个 JavaCC 插件,但这是另一回事)。但是现在,在运行“编译”之后添加一个对类的简单调用似乎有点过头了。
  • 你可以在 10 行中编写一个插件,运行一个工具似乎不仅仅是一个快速的任务,但你可以在 build.sbt 中将其作为一个任务来完成,然后在之后调用该任务编译。
  • 正如我所说,运行我们的工具只是调用一个 main 函数,因此 fullRunTask 可以轻松完成任务,但将动态参数传递给它,尤其是“值”是我遇到困难的地方。跨度>
【解决方案2】:

终于在阅读了《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)

示例项目包含一个带有 main 函数的 Foo.scala

【讨论】:

    猜你喜欢
    • 2016-10-26
    • 2015-08-02
    • 2020-05-15
    • 2010-09-10
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    相关资源
    最近更新 更多