2014-06-05 36 views
0

我的公司正在從螞蟻切換到sbt,以便將Scala集成到我們龐大的Java現有代碼中(如果你問我這個聰明的舉動)。 編譯完成後,我們通常會使用我們自己的工具(這是編譯的結果)對所有生成的.class進行後處理。如何在編譯後調用我們自己的.class後處理器?

我一直在嘗試在sbt中做同樣的事情,它看起來比預期的更復雜。 我試過了:

  • 用fullRunTask調用我們的後處理器。工作正常,但我們想通過「products.value」尋找.class文件,它不起作用

  • 另一個甚至更好的解決方案將擴展編譯(編譯在編譯〜= {result => ...)。但我沒有找到「result =>」後面的代碼如何調用我們的後處理程序

  • 我們正在尋找其他解決方案:多個項目,一個用於後處理器,一個用於其他代碼,這將清除但因爲源代碼糾結,這不像看起來那麼容易(我們仍然會遇到第一個問題)

任何幫助?

+0

您可以檢查是否我的回答到[類似的問題(http://stackoverflow.com/questions/23873031/sbt-plugin如何以列表文件的方式輸出增量重新編譯/ 23876075#23876075)會適合你嗎? – lpiepiora

+0

謝謝。看起來很有趣。 – user2753182

回答

0

我只會寫一個簡單的插件,在其他階段之後運行。它可以檢查所有.class文件的目標文件夾。

然後,您可以在構建服務器中執行類似sbt clean compile myplugin的操作。

這是proguard插件[1]採取的方法。你可以看看這個作爲一個起點。

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

+0

謝謝。這是我考慮過的事情(因爲我需要一個JavaCC插件,但這是另一個故事)。但現在,看起來像是矯枉過正,只是在運行「compile」之後給類添加一個簡單的調用。 – user2753182

+0

你可以用10行編寫一個插件,運行一個工具似乎不僅僅是一個快速的任務,但是你可以在build.sbt中做一個任務,然後在編譯之後調用任務。 – monkjack

+0

正如我所說,運行我們的工具只是簡單地調用一個主要的東西,所以fullRunTask很容易做到這一點,但是會傳遞動態參數給它,特別是「值」就是我很難過的地方。 – user2753182

0

最後,我發現讀 「SBT在行動」 等文件後的解決方案。這非常簡單,但對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與主要功能

相關問題